繁体   English   中英

在整个数据框中查找第一列元素并返回每行前面的第一列值(熊猫)

[英]find first column elements in entire data frame and return first column values in front of each row(Pandas)

我有下面的源数据框,需要将第一列(A)中的每个元素与B到E列匹配,如果找到它们,则返回第一列中的单元格值和新列(F)中的匹配行[在相关的前面列 (A) 中的元素,以逗号分隔。 例如,A 列中的“a”在 B 到 E 列中重复 4 次,列 (A)['b','c','d','e'] 中的相关值在新列中返回 (F )。 我通过 VBA excel 中的 for 循环来执行此操作,但将其转换为 python 对我来说很棘手。 感谢您的支持。

源数据框:

A   B   C   D   E

a   -            
b   a            
c   a            
d   b   a   -    
e   d   b   a   -

所需的数据框:

A   B   C   D   E   F   

a   -               b,c,d,e
b   a               d,e
c   a               
d   b   a   -       e
e   d   b   a   -   

下面是我到目前为止写的代码,但最后一行在列(F)中返回一个系列

import pandas as pd
import numpy as np
df = pd.DataFrame({'A': {0: 'a', 1: 'b', 2: 'c', 3: 'd', 4: 'e'},
 'B': {0: '-', 1: 'a', 2: 'a', 3: 'b', 4: 'd'}})

df['C'] = np.where(df['B'].isin(df['A'].values), df['B'], np.nan)
df['C'] = df['C'].map(dict(zip(df.A.values, df.B.values)))
df['D'] = np.where(df['C'].isin(df['B'].values), df['C'], np.nan)
df['D'] = df['D'].map(dict(zip(df.B.values, df['C'].values)))
df['E'] = np.where(df['D'].isin(df['C'].values), df['D'], np.nan)
df['E'] = df['E'].map(dict(zip(df['C'].values, df['D'].values)))
df1=df.iloc[:,1:5]
df['F']=[np.where(df1.values == x) for x in df['A']]

我从未使用过 pandas。 我也想看看其他的 np 解决方案。

import pandas as pd
import numpy as np
from IPython.display import display
df = pd.DataFrame({'A': {0: 'a', 1: 'b', 2: 'c', 3: 'd', 4: 'e'},
 'B': {0: '-', 1: 'a', 2: 'a', 3: 'b', 4: 'd'}})

df['C'] = np.where(df['B'].isin(df['A'].values), df['B'], np.nan)
df['C'] = df['C'].map(dict(zip(df.A.values, df.B.values)))
df['D'] = np.where(df['C'].isin(df['B'].values), df['C'], np.nan)
df['D'] = df['D'].map(dict(zip(df.B.values, df['C'].values)))
df['E'] = np.where(df['D'].isin(df['C'].values), df['D'], np.nan)
df['E'] = df['E'].map(dict(zip(df['C'].values, df['D'].values)))
df1=df.iloc[:,1:5]

# -->
df['F']=(t:=[np.where(df1.values == x) for x in df['A']])

f = []
my_data= df.to_dict()
for row in [vals[0].tolist() for vals in t]:
 temp = []
 for x in row:
  temp.append(my_data["A"][x])
 f.append(",".join(temp))
df['F'] = f
display(df)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM