我正在尝试在熊猫数据框中找到匹配的值。找到匹配项后,我要对数据框的行执行一些操作。
当前我正在使用此代码:
import pandas as pd
d = {'child_id': [1,2,5,4,7,8,9,10],
'parent_id': [3,4,1,3,11,6,12,13],
'content': ["thon","pan","py","das","ten","sor","js","on"]}
df = pd.DataFrame(data=d)
df2 = pd.DataFrame(columns = ("content_child", "content_parent"))
for i in range(len(df)):
for j in range(len(df)):
if str(df['child_id'][j]) == str(df['parent_id'][i]):
content_child = str(df["content"][i])
content_parent = str(df["content"][j])
s = pd.Series([content_child, content_parent], index=['content_child', 'content_parent'])
df2 = df2.append(s, ignore_index=True)
else:
pass
print(df2)
这将返回:
content_child content_parent
0 pan das
1 py thon
我尝试使用df.loc函数,但仅成功从子级获取内容或从父级获取内容
df.loc[df.parent_id.isin(df.child_id),['child_id','content']]
返回:
child_id content
1 2 pan
2 5 py
我编写的循环是否有快速的替代方法?
答案 0 :(得分:1)
如果左侧join
等于右侧child_id
,则只能使用parent_id
个数据帧作为条件。
df.set_index('parent_id').join(df.set_index('child_id'), rsuffix='_').dropna()
此代码将创建两个ID为parent_id
和child_id
的数据表。然后像往常一样将它们加入SQL连接。毕竟,删除NaN值并获得content
列。你想要哪一个。有2个内容列。其中之一是父内容,第二是子内容。
答案 1 :(得分:1)
要提高性能,请使用map
:
df['content_parent'] = df['parent_id'].map(df.set_index('child_id')['content'])
df = (df.rename(columns={'content':'content_child'})
.dropna(subset=['content_parent'])[['content_child','content_parent']])
print (df)
content_child content_parent
1 pan das
2 py thon
或使用默认内部联接的merge
:
df = (df.rename(columns={'child_id':'id'})
.merge(df.rename(columns={'parent_id':'id'}),
on='id',
suffixes=('_parent','_child')))[['content_child','content_parent']]
print (df)
content_child content_parent
0 py thon
1 pan das