如何计算python pandas中的特定列值?

时间:2017-01-31 10:11:37

标签: python pandas

我的数据框如下:

df1_data = {'sym' :{0:'AAA',1:'BBB',2:'CCC',3:'AAA',4:'CCC',5:'DDD',6:'EEE',7:'EEE',8:'FFF'},
        'identity' :{0:'AD',1:'AD',2:'AU',3:'AU',4:'AU',5:'AZ',6:'AU',7:'AZ',8:'AZ'}}

我想在我的数据框中检查 sym 列。我的目的是生成两个不同的文件,一个包含不同顺序的相同两列,第二个文件包含sym,sym_count,AD_count,AU_count,neglected_count列。

修改1 -

我想避免(AD& AU)以外的身份。在两个输出文件中我都不想要AD&的结果。所有身份。 neglected_count 列是可选的。

预期结果 -

result.csv

sym,identity
AAA,AD
AAA,AU
BBB,AD
CCC,AU
CCC,AU
EEE,AU

result_count.csv

sym,sym_count,AD_count,AU_count,neglected_count
AAA,2,1,1,0
BBB,1,1,0,0
CCC,2,0,2,0
EEE,2,0,1,1

如何在python pandas中执行此类计算?

1 个答案:

答案 0 :(得分:2)

我认为您需要crosstabinsert一起添加sum列到第一个位置,add_suffix到列名称。

上次写to_csv

df1_data = {'sym' :{0:'AAA',1:'BBB',2:'CCC',3:'AAA',4:'CCC',5:'DDD',6:'EEE',7:'EEE',8:'FFF'},
        'identity' :{0:'AD',1:'AD',2:'AU',3:'AU',4:'AU',5:'AZ',6:'AU',7:'AZ',8:'AZ'}}
df = pd.DataFrame(df1_data, columns=['sym','identity'])
print (df)
   sym identity
0  AAA       AD
1  BBB       AD
2  CCC       AU
3  AAA       AU
4  CCC       AU
5  DDD       AZ
6  EEE       AU
7  EEE       AZ
8  FFF       AZ

#write to csv
df.to_csv('result.csv', index=False)
#need vals only in identity
vals = ['AD','AU']

#replace another values to neglected
neglected = df.loc[~df.identity.isin(vals), 'identity'].unique().tolist()
neglected = {x:'neglected' for x in neglected}
print (neglected)
{'AZ': 'neglected'}

df.identity = df.identity.replace(neglected)

df1 = pd.crosstab(df['sym'], df['identity'])
df1.insert(0, 'sym', df1.sum(axis=1))
df2 = df1.add_suffix('_count').reset_index()
#find all rows where is 0 in columns with vals
mask = ~df2.filter(regex='|'.join(vals)).eq(0).all(axis=1)
print (mask)
0     True
1     True
2     True
3    False
4     True
5    False
dtype: bool

#boolean indexing
df2 = df2[mask]
print (df2)
identity  sym  sym_count  AD_count  AU_count  neglected_count
0         AAA          2         1         1                0
1         BBB          1         1         0                0
2         CCC          2         0         2                0
4         EEE          2         0         1                1

df2.to_csv('result_count.csv', index=False)