首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >熊猫:如果'C‘列值为'x’,则更新列'E‘值

熊猫:如果'C‘列值为'x’,则更新列'E‘值
EN

Stack Overflow用户
提问于 2019-02-21 17:01:56
回答 3查看 58关注 0票数 2

我有个Dataframe:

代码语言:javascript
复制
           A           B       C       D  E
0      NSPNT  'ACTENRGY'  'XD01'   'DSU'  F
1      NSPNT  'ACTENRGY'  'XD21'   'DSU'  F
2      NSPNT  'ACTENRGY'  'XD22'   'DSU'  F
3      NSPNT  'ACTENRGY'  'XD23'   'DSU'  F
4      NSPNT  'ACTENRGY'  'XD24'   'DSU'  F
5      NSPNT  'ACTENRGY'  'XD25'   'DSU'  F
6      NSPNT  'ACTENRGY'  'XD01'   'DSU'  F
7      NSPNT  'ACTENRGY'   'ACK'  'MISC'  F
8      NSPNT  'ACTENRGY'   'ACU'  'MISC'  F
9      NSPNT  'ACTENRGY'   'ACK'  'MISC'  F
10     NSPNT  'ACTENRGY'   'ACU'  'MISC'  F
11     NSPNT  'ACTENRGY'   'ACK'  'MISC'  F
12     NSPNT  'ACTENRGY'   'ACU'  'MISC'  F
13     NSPNT  'ACTENRGY'   'ACF'  'MISC'  F
14     NSPNT  'ACTENRGY'   'ASF'  'MISC'  F
15     NSPNT  'ACTENRGY'   'DEF'  'MISC'  F
16     NSPNT  'ACTENRGY'   'RLR'   'RLR'  T

我想要实现的是,当列'C‘=’ACK‘使'E’=T到目前为止,我已经尝试了以下步骤:

代码语言:javascript
复制
import os
import pandas as pd


source_folder = 'D:/NSSCDB/STTS_RCL_Export/'

def editNSPNT():

    for somefile in os.listdir(source_folder):
        if (somefile.startswith(('nsscdb_output_dts')) and 
somefile.endswith(('.txt'.lower()))):

            df = pd.read_csv(source_folder + somefile, encoding='utf-8', names = ['A','B','C','D','E'], header=4)
            #for x in df['C']:
                #if (x == 'ACK'):
                    #df['E'] = 'T'
            #df.E = ["T" if x == "ACK" for x in df.C]
            df.loc[(df.C=='ACK')]['E'] = 'T'

            print(df)



def main():

    editNSPNT()


if __name__== "__main__":
    main()   

我一直在尝试的方法都没有用,有人能告诉我我做错了什么吗?谢谢。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-02-21 17:09:56

修正loc()

代码语言:javascript
复制
df.loc[df.C == "'ACK'", 'E'] = 'T'

结果是:

代码语言:javascript
复制
    A   B   C   D   E
0   NSPNT   'ACTENRGY'  'XD01'  'DSU'   F
1   NSPNT   'ACTENRGY'  'XD21'  'DSU'   F
2   NSPNT   'ACTENRGY'  'XD22'  'DSU'   F
3   NSPNT   'ACTENRGY'  'XD23'  'DSU'   F
4   NSPNT   'ACTENRGY'  'XD24'  'DSU'   F
5   NSPNT   'ACTENRGY'  'XD25'  'DSU'   F
6   NSPNT   'ACTENRGY'  'XD01'  'DSU'   F
7   NSPNT   'ACTENRGY'  'ACK'   'MISC'  T
8   NSPNT   'ACTENRGY'  'ACU'   'MISC'  F
9   NSPNT   'ACTENRGY'  'ACK'   'MISC'  T
10  NSPNT   'ACTENRGY'  'ACU'   'MISC'  F
11  NSPNT   'ACTENRGY'  'ACK'   'MISC'  T
12  NSPNT   'ACTENRGY'  'ACU'   'MISC'  F
13  NSPNT   'ACTENRGY'  'ACF'   'MISC'  F
14  NSPNT   'ACTENRGY'  'ASF'   'MISC'  F
15  NSPNT   'ACTENRGY'  'DEF'   'MISC'  F
16  NSPNT   'ACTENRGY'  'RLR'   'RLR'   T

使用原始代码,首先用(不考虑简单引号)对数据进行切片:

代码语言:javascript
复制
df.loc[(df.C=='ACK')]

然后为切片数据value的列E分配一个值。

代码语言:javascript
复制
['E'] = 'T'

换句话说,您是在更新切片,而不是数据帧本身。

来自Pandas文件:

.loc[]主要是基于标签的,但也可以与布尔数组一起使用。

破译密码:

代码语言:javascript
复制
df.loc[df.C == "'ACK'", 'E']

df.C == "'ACK'"将返回一个识别行的布尔数组,而字符串'E'将立即标识将接收新值的列,而无需切片。

票数 1
EN

Stack Overflow用户

发布于 2019-02-21 17:11:23

数据中的单引号会导致问题吗?

代码语言:javascript
复制
df.loc[df['C'] == "'ACK'",'E'] = 'T'

用双引号,

代码语言:javascript
复制
        A           B       C       D  E
0   NSPNT  'ACTENRGY'  'XD01'   'DSU'  F
1   NSPNT  'ACTENRGY'  'XD21'   'DSU'  F
2   NSPNT  'ACTENRGY'  'XD22'   'DSU'  F
3   NSPNT  'ACTENRGY'  'XD23'   'DSU'  F
4   NSPNT  'ACTENRGY'  'XD24'   'DSU'  F
5   NSPNT  'ACTENRGY'  'XD25'   'DSU'  F
6   NSPNT  'ACTENRGY'  'XD01'   'DSU'  F
7   NSPNT  'ACTENRGY'   'ACK'  'MISC'  T
8   NSPNT  'ACTENRGY'   'ACU'  'MISC'  F
9   NSPNT  'ACTENRGY'   'ACK'  'MISC'  T
10  NSPNT  'ACTENRGY'   'ACU'  'MISC'  F
11  NSPNT  'ACTENRGY'   'ACK'  'MISC'  T
12  NSPNT  'ACTENRGY'   'ACU'  'MISC'  F
13  NSPNT  'ACTENRGY'   'ACF'  'MISC'  F
14  NSPNT  'ACTENRGY'   'ASF'  'MISC'  F
15  NSPNT  'ACTENRGY'   'DEF'  'MISC'  F
16  NSPNT  'ACTENRGY'   'RLR'   'RLR'  T
票数 3
EN

Stack Overflow用户

发布于 2019-02-21 17:28:50

使用numpy.where()的解决方案

代码语言:javascript
复制
df.E=np.where(df.C.eq("'ACK'"),'T',df.E)
print(df)

输出:

代码语言:javascript
复制
        A           B       C       D  E
0   NSPNT  'ACTENRGY'  'XD01'   'DSU'  F
1   NSPNT  'ACTENRGY'  'XD21'   'DSU'  F
2   NSPNT  'ACTENRGY'  'XD22'   'DSU'  F
3   NSPNT  'ACTENRGY'  'XD23'   'DSU'  F
4   NSPNT  'ACTENRGY'  'XD24'   'DSU'  F
5   NSPNT  'ACTENRGY'  'XD25'   'DSU'  F
6   NSPNT  'ACTENRGY'  'XD01'   'DSU'  F
7   NSPNT  'ACTENRGY'   'ACK'  'MISC'  T
8   NSPNT  'ACTENRGY'   'ACU'  'MISC'  F
9   NSPNT  'ACTENRGY'   'ACK'  'MISC'  T
10  NSPNT  'ACTENRGY'   'ACU'  'MISC'  F
11  NSPNT  'ACTENRGY'   'ACK'  'MISC'  T
12  NSPNT  'ACTENRGY'   'ACU'  'MISC'  F
13  NSPNT  'ACTENRGY'   'ACF'  'MISC'  F
14  NSPNT  'ACTENRGY'   'ASF'  'MISC'  F
15  NSPNT  'ACTENRGY'   'DEF'  'MISC'  F
16  NSPNT  'ACTENRGY'   'RLR'   'RLR'  T
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54812492

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档