Python 熊猫:更新列';E';列';C';值为';x';

Python 熊猫:更新列';E';列';C';值为';x';,python,pandas,Python,Pandas,我有一个数据帧,如: 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 'ACTE

我有一个数据帧,如:

           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 到目前为止,我尝试了以下方法:

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()   
我一直尝试的两种方法都不管用,有人能告诉我我做错了什么吗? 谢谢

仅纠正以下问题:

结果是:

    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
使用您的原始代码,首先使用(不考虑简单的引号)对数据帧进行切片:

然后为切片数据帧的列
E
指定一个值

['E'] = 'T'
换句话说,您是在更新切片,而不是数据帧本身

从熊猫文件:

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

分解代码:

df.loc[df.C == "'ACK'", 'E']

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

数据中的单引号是否会导致问题

df.loc[df['C'] == "'ACK'",'E'] = 'T'
使用双引号

        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
        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
解决方案使用:

输出:

        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
df.E=np.where(df.C.eq("'ACK'"),'T',df.E)
print(df)
        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