簡體   English   中英

使用另一個 Dataframe 作為查找表替換 Pandas Dataframe 中的值

[英]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)
    )

過程2

暫無
暫無

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

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