Sha*_*ker 6 python dataframe pandas
我有两个不同的数据帧(df1,df2),具有完全不同的形状: df1: (64, 6); df2: (564, 9)。df1 包含一列 (df1.objectdesc),其中的值(字符串)也可以在 df2 (df2.objdescription) 的列中找到。由于两个数据框具有不同的形状,我必须使用它.isin()来获取匹配的值。然后,我想从 df2 (df2.idname) 中的不同列中从匹配的行中获取第三个值,并将它们添加到 df1 - 这就是我挣扎的地方。
示例数据集:
df1
Content objectdesc TS_id
0 sdrgs 1_OG.Raum45 55
1 sdfg 2_OG.Raum23 34
2 psdfg GG.Raum12 78
3 sdfg 1_OG.Raum98 67
Run Code Online (Sandbox Code Playgroud)
df2:
Numb_val object_count objdescription min idname
0 463 9876 1_OG_Raum76 1 wq19
1 251 8324 2_OG.Raum34 9 zt45
2 456 1257 1_OG.Raum45 4 bh34
3 356 1357 2_OG.Raum23 3 if32
4 246 3452 GG.Raum12 5 lu76
5 345 8553 1_OG.Raum98 8 pr61
Run Code Online (Sandbox Code Playgroud)
预期输出:
Content objectdesc TS_id idname
0 sdrgs 1_OG.Raum45 55 bh34
1 sdfg 2_OG.Raum23 34 if32
2 psdfg GG.Raum12 78 lu76
3 sdfg 1_OG.Raum98 67 pr61
Run Code Online (Sandbox Code Playgroud)
到目前为止,这是我的代码:
def get_id(x, y):
for values in x,y:
if x['objectdesc'].isin(y['objdescription']).any() == True:
return y['idname']
df1['idname'] = get_id(df1, df2)
Run Code Online (Sandbox Code Playgroud)
不幸的是,这仅提供从索引 0 开始的值df2['idname'],而不是真正为我提供匹配行中的值。
任何帮助表示赞赏。谢谢你!
小智 6
可能会尝试这个:
df1.merge(df2, left_on='objectdesc', right_on='objdescription')[['Content', 'objectdesc', 'TS_id', 'idname']]
Run Code Online (Sandbox Code Playgroud)
参考:
https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.merge.html
您可以将两者合并。
from io import StringIO
import pandas as pd
df_1_str = \
'''
Content objectdesc TS_id
sdrgs 1_OG.Raum45 55
sdfg 2_OG.Raum23 34
psdfg GG.Raum12 78
sdfg 1_OG.Raum98 67
'''
df_2_str = \
'''
Numb_val object_count objdescription min idname
463 9876 1_OG_Raum76 1 wq19
251 8324 2_OG.Raum34 9 zt45
456 1257 1_OG.Raum45 4 bh34
356 1357 2_OG.Raum23 3 if32
246 3452 GG.Raum12 5 lu76
345 8553 1_OG.Raum98 8 pr61
'''
df_1 = pd.read_csv(StringIO(df_1_str), header=0, delim_whitespace=True)
df_2 = pd.read_csv(StringIO(df_2_str), header=0, delim_whitespace=True)
df_3 = df_1.merge(df_2[['objdescription', 'idname']], left_on='objectdesc',
right_on='objdescription').drop('objdescription', axis='columns')
Run Code Online (Sandbox Code Playgroud)
内容df_3:
Content objectdesc TS_id idname
-- --------- ------------ ------- --------
0 sdrgs 1_OG.Raum45 55 bh34
1 sdfg 2_OG.Raum23 34 if32
2 psdfg GG.Raum12 78 lu76
3 sdfg 1_OG.Raum98 67 pr61
Run Code Online (Sandbox Code Playgroud)