簡體   English   中英

根據列名稱替換pandas數據框中的值

[英]Replace values in pandas dataframe based on column names

我想根據列名替換另一個系列的pandas數據框中的值。 我有傻瓜。 數據幀:

Y2000   Y2001   Y2002    Y2003    Y2004    Item    Item Code
34        43      0      0          25     Test      Val

我還有另一個系列:

Y2000    41403766
Y2001    45283735
Y2002    47850796
Y2003    38639101
Y2004    45226813

如何根據第二個系列中的值替換第一個數據框中的值?

-更多編輯:要重新創建問題,代碼和數據在這里: umd.box.com/s/hqd6oopj6vvp4qvpwnj8r4lm3z7as4i3

運行代碼的說明:

要運行此代碼:

  1. 將config_rotations.txt中的data_dir替換為輸入目錄的路徑,即保存文件的位置

  2. 用所需的任何輸出路徑替換config_rotations.txt中的out_dir

  3. 運行python code \\ crop_stats.py。 問題出在crop_stats.py的第133行

- 編輯:

基於@Andy的查詢,這是我想要的結果:

Y2000      Y2001   Y2002     Y2003      Y2004          Item    Item Code
41403766  45283735 47850796  38639101  45226813     Test      Val

我試過了

df_a.replace(df_b)

但這不會更改df_a中的任何值

您可以在重塑和覆蓋列之后從該系列構造一個df:

In [85]:
df1[s.index] = pd.DataFrame(columns = s.index, data = s.values.reshape(1,5))
df1

Out[85]:
      Y2000     Y2001     Y2002     Y2003     Y2004  Item Item  Code
0  41403766  45283735  47850796  38639101  45226813  Test        Val

因此,這使用序列索引值從df中進行子選擇,然后從同一序列構造df,這里我們必須對數組進行整形以形成單行df

編輯

我上面的代碼無法在您的真實代碼上運行的原因首先是在分配您無法執行此操作時:

df.loc[(df['Country Code'] == replace_cnt) & (df['Item'] == crop)][s.index]

這稱為鏈式索引並發出警告,請參閱docs

因此,要糾正此問題,您可以將列放在[]

df.loc[(df['Country Code'] == replace_cnt) & (df['Item'] == crop),s.index]

另外,pandas嘗試沿索引值和列名對齊,如果它們不匹配,那么您將獲得NaN值,因此您可以通過調用.values獲得一個np數組來解決這個問題,該數組只是成為沒有索引或列標簽,只要數據形狀是可廣播的,它就會做您想要的:

df.loc[(df['Country Code'] == replace_cnt) & (df['Item'] == crop),s.index] = pd.DataFrame(columns=s.index, data=s.values.reshape(1, len(s.index))).values

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM