2016-12-05 4 views
1

Я один dataframe df_in определяется как:Запасного значения другого столбца в dataframe с пандами

import pandas as pd 

dic_in = {'A': ['ff','rr' ,'nn' ,'qq','tt' ,'pp','uu'], 
     'B1': ['33',r'\N','39' ,'22',r'\N','56','90'], 
     'C1': ['44',r'\N','74' ,'34',r'\N','89','99'], 
     'B2': ['33','63' ,r'\N','22','71' ,'56','90'], 
     'C2': ['44','85' ,r'\N','34','52' ,'89','99']} 
df_in = pd.DataFrame(dic_in,columns=['A','B1','C1','B2','C2']) 

, если напечатать его на консоли это выглядит следующим образом:

In [28]:df_in 
Out[28]: 
    A B1 C1 B2 C2 
0 ff 33 44 33 44 
1 rr \N \N 63 85 
2 nn 39 74 \N \N 
3 qq 22 34 22 34 
4 tt \N \N 71 52 
5 pp 56 89 56 89 
6 uu 90 99 90 99 

Что я хотел бы сделать так, чтобы исследовать каждую строку столбцов B1 и C1: если общая строка содержит \N в обоих столбцах, она должна подставлять ее значения в B2 и C2 соответственно. Таким образом, выход (df_out) должен выглядеть следующим образом:

In [28]:df_in    In[30]:df_out 
Out[28]:      Out[30]: 
    A B1 C1 B2 C2   A B C 
0 ff 33 44 33 44  0 ff 33 44 
1 rr \N \N 63 85 -----> 1 rr 63 85 
2 nn 39 74 \N \N -----> 2 nn 39 74 
3 qq 22 34 22 34  3 qq 22 34 
4 tt \N \N 71 52 -----> 4 tt 71 52 
5 pp 56 89 56 89  5 pp 56 89 
6 uu 90 99 90 99  6 uu 90 99 

я смог достичь своей цели, используя следующие строки кода:

df_out = pd.DataFrame() 
for index, row in df_in.iterrows(): 
    if row['B1']!=r'\N' and row['C1']!=r'\N': 
     dic = {'A': [row['A']], 'B': [row['B1']], 'C': [row['C1']]} 
     df_out = pd.concat([df_out,pd.DataFrame(dic)], ignore_index=True) 
    else: 
     dic = {'A': [row['A']], 'B': [row['B2']], 'C': [row['C2']]} 
     df_out = pd.concat([df_out,pd.DataFrame(dic)], ignore_index=True) 

Можете ли вы предложить мне умный способ достижения такой результат?

ответ

1

Вы можете первым replace\N к NaN, а затем combine_first или fillna:

df_out = df_in.replace({'\\N': np.nan}) 
df_out['B']= df_out.B1.combine_first(df_out.B2) 
df_out['C'] = df_out.C1.combine_first(df_out.C2) 
df_out = df_out[['A','B','C']] 
print (df_out) 
    A B C 
0 ff 33 44 
1 rr 63 85 
2 nn 39 74 
3 qq 22 34 
4 tt 71 52 
5 pp 56 89 
6 uu 90 99 

Если нужно добавить значения по подмножестве B1 с C1 к B2 с C2:

df_out = df_in.replace({'\\N': np.nan}) 
df_out[['B', 'C']] = df_out[['B1', 'C1']].fillna(df_out[['B2', 'C2']] 
             .rename(columns={'B2':'B1','C2':'C1'})) 
df_out = df_out[['A','B','C']] 
print (df_out) 
    A B C 
0 ff 33 44 
1 rr 63 85 
2 nn 39 74 
3 qq 22 34 
4 tt 71 52 
5 pp 56 89 
6 uu 90 99 
1

Это еще одно решение, в котором вы явно указываете случай, когда хотите заменить значения:

import pandas as pd 

dic_in = {'A': ['ff','rr' ,'nn' ,'qq','tt' ,'pp','uu'], 
     'B1': ['33',r'\N','39' ,'22',r'\N','56','90'], 
     'C1': ['44',r'\N','74' ,'34',r'\N','89','99'], 
     'B2': ['33','63' ,r'\N','22','71' ,'56','90'], 
     'C2': ['44','85' ,r'\N','34','52' ,'89','99']} 

df_in = pd.DataFrame(dic_in,columns=['A','B1','C1','B2','C2']) 

df_out = pd.DataFrame(df_in['A']) 

def substitute(row): 
    return row[0] if row[0]!='\N' else row[1] 

df_out['B'] = df_in[['B1', 'B2']].apply(substitute, axis = 1) 
df_out['C'] = df_in[['C1', 'C2']].apply(substitute, axis = 1) 

df_out 
Out[35]: 
    A B C 
0 ff 33 44 
1 rr 63 85 
2 nn 39 74 
3 qq 22 34 
4 tt 71 52 
5 pp 56 89 
6 uu 90 99 

 Смежные вопросы

  • Нет связанных вопросов^_^