簡體   English   中英

在Pandas / Python中使用可變大小的行更新數據框

[英]Updating dataframe with rows of variable size in Pandas/Python

我已經將Excel工作表導入到Pandas的數據框中。 空白值替換為“ NA”。 我要為每個行值基於字典或數據框的索引替換它們。

df1 = pd.DataFrame(
    {'c1':['a','a','b','b'], 'c2':['1','2','1','3'], 'c3':['2','NA','3','NA']},index=['first','second','third','last'])

>>> df1
       c1 c2  c3
first  a  1    2
second a  2    NA
third  b  1    3
last   b  3    NA

我想根據另一個數據框(或字典)的索引替換每一行中的值。

df2=pd.DataFrame(
    {'val':['v1','v2','v3']},index=['1','2','3'])

>>> df2
   val
1  v1  
2  v2 
3  v3 

這樣輸出就變成

>>> out
       c1 c2  c3
first  a  v1  v2
second a  v2  NA
third  b  v1  v3
last   b  v3  NA

您將如何通過Pandas和/或Python做到這一點? 一種方法是逐行搜索,但是也許有更簡單的方法嗎?

編輯:重要的是,由於我要處理的大小為4653行×1984列的'df1',在我的實際情況下,性能成為一個問題

先感謝您

一種方法是stack + replace + unstack組合:

df1.stack().replace(df2.val).unstack()

在此處輸入圖片說明

原始答案

s = df1.squeeze()
df2.replace(s)

replace非常非常慢。 對於像這樣的較大數據集,請檢查以下示例,該示例在大約20秒內完成了超過3000萬個值(超過1000萬個值)。 查找系列包含900k個值,范圍從0到1百萬。

“地圖”快得多了。 map的唯一問題是它將替換找不到的值,因此您必須將fillna與原始DataFrame一起使用以替換那些丟失的值。

n = 10000000
df = pd.DataFrame({'c1':np.random.choice(list('abcdefghijkl'), n),
                 'c2':np.random.randint(0, 1000000, n),
                 'c3':np.random.randint(0, 1000000, n)})

s = pd.Series(index=np.random.choice(np.arange(1000000), 900000, replace=False), 
              data=np.random.choice(list('adsfjhqwoeriouzxvmn'), 900000, replace=True))

df.stack().map(s).unstack().fillna(df)

您也可以執行此操作,這可以在我的數據上運行得更快,但是您的數據非常寬,因此可能會變慢

df.apply(lambda x: x.map(s)).fillna(df)

在與您類似的DataFrame上,我得到6s完成。

df = pd.DataFrame(np.random.randint(0, 1000000, (5000, 2000)))
df.stack().map(s).unstack().fillna(df)

暫無
暫無

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

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