![](/img/trans.png)
[英]Replace values in column of Pandas DataFrame using a Series lookup table
[英]Replace values in Pandas Dataframe using another Dataframe as a lookup table
我希望通過將第一個 Dataframe 中的值與第二個 Dataframe 中的列匹配,將 Dataframe 中的值替換為第二個 Dataframe 中的值。
例子:
import numpy as np
import pandas as pd
dt_index = pd.to_datetime(['2003-05-01', '2003-05-02', '2003-05-03', '2003-05-04'])
df = pd.DataFrame({'A':[1,1,3,12], 'B':[12,1,3,3], 'C':[3,12,12,1]}, index = dt_index)
df2 = pd.DataFrame({1:[1.4,4.2,1.3,5.6], 12:[2.3,7.3,9.5,0.4], 3:[8.8,0.1,8.7,2.4], 4:[9.6,9.8,5.5,1.8]}, index = dt_index)
df =
A B C
2003-05-01 1 12 3
2003-05-02 1 1 12
2003-05-03 3 3 12
2003-05-04 12 3 1
df2 =
1 12 3 4
2003-05-01 1.4 2.3 8.8 9.6
2003-05-02 4.2 7.3 0.1 9.8
2003-05-03 1.3 9.5 8.7 5.5
2003-05-04 5.6 0.4 2.4 1.8
預計 output:
expect = pd.DataFrame({'A':[1.4,4.2,8.7,0.4], 'B':[2.3,4.2,8.7,2.4], 'C':[8.8,7.3,9.5,5.6]}, index = dt_index)
expect =
A B C
2003-05-01 1.4 2.3 8.8
2003-05-02 4.2 4.2 7.3
2003-05-03 8.7 8.7 9.5
2003-05-04 0.4 2.4 5.6
試圖:
X = df.copy()
for i in np.unique(df):
X.mask(df == i, df2[i], axis=0, inplace=True)
我的嘗試似乎奏效了,但我不確定它是否有任何缺陷以及它如何隨着 Dataframe 的大小增加而擴展。
有更好或更快的解決方案嗎?
在 cottontail 的有用回答之后,我意識到我在我的示例中進行了過度簡化。 不能假設 df 中的值以及 df 和 df2 的列是連續的。
我現在修改了示例以反映這一點。
一種方法是使用stack()
將df2
重塑為 Series 並使用df
中的值對其進行reindex()
; 使用unstack()
重塑回原始形狀。
tmp = df2.stack().reindex(df.stack().droplevel(-1).items())
tmp.index = pd.MultiIndex.from_arrays([tmp.index.get_level_values(0), df.columns.tolist()*len(df)])
df = tmp.unstack()
另一種方法是迭代創建一個形狀像df2
的虛擬 dataframe ,將其乘以df2
,將其縮減為一個系列(使用sum()
)並將其分配給一個形狀像df
的空 dataframe 。
X = pd.DataFrame().reindex_like(df)
df['dummy'] = 1
for c in X:
X[c] = (
df.groupby([df.index, c])['dummy'].size()
.unstack(fill_value=0)
.reindex(df2.columns, axis=1, fill_value=0)
.mul(df2)
.sum(1)
)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.