2017-06-01 150 views
0

我有兩個dfs,一個是數據,另一個是用「keys」替換。我想繼續使用「keys」df,並且如果密鑰存在於數據df中,則在數據df中,更改爲該密鑰的值並對行進行一些合併。Python Pandas合併行並將數據轉換爲第二個df

因此,例如,這是在數據DF:

col1 col2 col3 total total_col1 total_col2 
bbb V V X  2  DF1  DF2 
ccc V X X  1  DF1   
zzz X V V  2     DF2 
qqq X V X  1      
rrr X V V  2  DF1, DF2  

和這是 「鍵」 DF:

key  value 
bbb  b value 
zzz  z value 
qqq  ---- 
rrr  b value 

所以輸出值將合併用相同值的行(BBB和rrr相同的值),如果值是'----',那麼數據將是相同的,並且如果沒有密鑰,那麼數據也將是相同的。所以輸出是:

  col1 col2 col3 total total_col1  total_col2 
b value V V V  3  DF1, DF2  DF2 
ccc  V X X  1  DF1   
z value X V V  2      DF2 
qqq  X V X  1      

這是可能與熊貓?

+0

而你如何解釋在其他列上合併的其餘部分? – piRSquared

回答

1

答案是肯定的。假設你有以下dataframe爲您df1

>>> df1 = pd.DataFrame({'key':['aaa','bbb','ccc','ddd']}) 
>>> df1 
    key 
0 aaa 
1 bbb 
2 ccc 
3 ddd 

然後你有其他dataframe這是參考表稱爲df2

>>> df2 
    key value 
0 aaa value a 
1 ccc value c 

爲了得到下面的結果,

>>> result 
    key 
0 value a 
1 bbb 
2 value c 
3 ddd 

你只需要merge然後fillnaNaN

>>> df1['key'] = df1.merge(df2, on=['key'], how='left')['value'].fillna(value=df1.key, axis=0) 
>>> df1 
    key 
0 value a 
1 bbb 
2 value c 
3 ddd 

附加

如果您keydf1是在索引中,那麼你可以使用reset_indexindex轉換爲column。例如,

>>> df = pd.DataFrame(data={'col1':['val1','val2','val3']}, index=['aaa','bbb','ccc']) 
>>> df 
    col1 
aaa val1 
bbb val2 
ccc val3 
>>> df.reset_index().rename(columns={'index':'key'}) 
    key col1 
0 aaa val1 
1 bbb val2 
2 ccc val3 
+0

我的'df1'索引列沒有名字,所以我不能像'df1 ['key'] = ...那樣訪問它,那麼我怎樣才能訪問它? 'df1 [level = 0]'不起作用 – TheDaJon

+0

您可以使用'reset_index'將'index'轉換爲'column'。請參閱編輯的答案。 – arnold

+0

我在使用合併時遇到了問題,因爲'df_keys'中的'keys'是來自long的類型,並且由於某種原因,'df'中的值來自類型unicode。我正在嘗試編碼它,但它給出了'ascii無法讀取編解碼器......'的另一個錯誤。有沒有辦法與'=='操作符或與合併,這將工作? – TheDaJon

0

您可以使用名爲update的pandas Dataframe函數。其中的文檔可以找到here

你可以去通過以下方式

df.update(keys_df) 

但在此之前連鍵更新數據幀DF,確保鍵列是keys_df datafrane的索引,然後才應這項工作。

希望這會有所幫助。快樂編碼。 乾杯!

0

下面可能適合您。

# getting the row index of df 
df_index = df.index 

# getting the row index of keys 
keys_index = keys.index 

# for those indices existing in keys, we rename the coresponding ones in df 
for i in keys_index: 
    if i in df_index and keys[i]: 
      df.rename(index={i: keys[i]}) 
相關問題