2017-01-31 3 views
2

У меня dataframe, как показано ниже:Как подсчитать конкретные значения столбцов в 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 колонки в моей dataframe. Мое намерение состоит в том, чтобы сгенерировать два разных файла, один из которых содержит одинаковые два столбца в другом порядке, а второй файл содержит столбцы sym, sym_count, AD_count, AU_count, neglected_count.

Edit 1 -

Я хочу, чтобы избежать идентичности, кроме (AD & AU). В обоих выходных файлах я не хочу получить результат AD & AU. neglected_count column не является обязательным.

Ожидаемое result-

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 

Как я могу выполнить такой тип вычисления в питона панд?

ответ

2

Я думаю, вам нужно crosstab с insert для добавления 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) 
+0

Он работает. решение для result.csv? – kit

+0

См. Раздел «Редактирование» 1. Требование немного изменилось для result_count.csv и result.csv. Я сказал, что о result.csv не result_count.csv. пожалуйста, внимательно прочитайте. – kit

+0

Пожалуйста, проверьте мое решение. – jezrael