首页 > 解决方案 > Pandas 行迭代查询

问题描述

我有这个虚拟数据集。假设 df_1

Column  x   y
AAA    20   30
BBB    10   50
CCC    60   80
DDD    90   100
PQR    30   40
RST    50   60
UVW    30   40
LMN    20   30

接下来是另一个数据集。让我们说这个df_2。我必须查找(df_1 的)列并查看 df_2 中的映射。就像 CCC 和 DDD 是配对的。PQR、RST 和 UVW 是配对的。

Index   0   1   2
1      AAA      
2      BBB      
3      CCC  DDD 
4      XYZ      
5      PQR  RST UVW

这是所需的输出。假设这个 df_output

Ouput         x      y
AAA           20    30
BBB           10    50
CCC+DDD       150   180
PQR+RST+UVW   110   140
LMN           20    30

我正在探索 pandas python 的 iterrows 和 isin 方法,但无法提出解决方案。谁能帮我解决这个问题

方法:我正在考虑在 df_2 中查找 df_1 的每一行,如果找到则添加它们。

Pseudo Code
for i,j in df_1.iterrows():
    if j isin df_2.columns:
       Add

标签: pythonpandasdataframe

解决方案


这是一个解决方案,为了更清晰,分几个步骤:

t = df2.melt(id_vars="Index").dropna()
x_y = pd.merge(t, df1, left_on="value", right_on="Column").groupby("Index").sum()

names = pd.DataFrame(df2.drop("Index", axis=1).stack()).reset_index().groupby("level_0")[0].apply(lambda x: " ".join(x))
names = df2.melt(id_vars="Index").dropna().groupby("Index")["value"].apply(lambda x: " ".join(x))

df1_only = pd.merge(df1, t, left_on="Column", right_on = "value", how = "left", indicator=True)
df1_only = df1_only[df1_only._merge == "left_only"]
df1_only = df1_only[["Column", "x", "y"]].rename(columns = {"Column": "value"})

res = pd.concat([names, x_y], axis=1)
res = pd.concat([res, df1_only], axis = 0)
res = res.dropna()

Output: 

         value      x      y
1          AAA   20.0   30.0
2          BBB   10.0   50.0
3      CCC DDD  150.0  180.0
5  PQR RST UVW  110.0  140.0
7          LMN   20.0   30.0

推荐阅读