gpt4 book ai didi

python - 在第二个数据框中的值上加入两个数据框

转载 作者:太空宇宙 更新时间:2023-11-04 00:45:17 24 4
gpt4 key购买 nike

我正在尝试从数据集中的值中加入两个数据框:

df1     t0      t1      text0   text1
ID
2133 7.0 3.0 NaN NaN
1234 10.0 8.0 NaN NaN
7352 9.0 7.0 NaN NaN
2500 7.0 6.0 NaN NaN
3298 10.0 8.0 NaN NaN

df1(见上文)

df2     score   text_org
ID
2133 7.0 asdf
2500 7.0 cccc
3298 8.0 ytyt
2133 3.0 qwer
1234 10.0 pois
7352 9.0 ijsd
7352 7.0 bdcs
3298 10.0 swed
1234 8.0 zzzz
2500 6.0 erer

和 df2(见上文)

我正在尝试合并这两个数据帧,以便将 df1 中的 NaN 替换为 df2 中的 text_org。如您所见,我们通过将 ID 与来自 t0 或 t1 的分数进行匹配来获取文本。理想情况下,它看起来像这样:

 df1     t0     t1      text0   text1
ID
2133 7.0 3.0 asdf qwer
1234 10.0 8.0 pois zzzz
7352 9.0 7.0 ijsd bdcs
2500 7.0 6.0 cccc erer
3298 10.0 8.0 swed ytyt

我正在尝试使用 pd.merge - 加入,但我没有得到任何结果。谢谢你的帮助!

最佳答案

可以先用meltdrop reshape 空列 text0text1:

df = pd.melt(df1.drop(['text0','text1'], axis=1), id_vars='ID', value_name='score')
print (df)
ID variable score
0 2133 t0 7.0
1 1234 t0 10.0
2 7352 t0 9.0
3 2500 t0 7.0
4 3298 t0 10.0
5 2133 t1 3.0
6 1234 t1 8.0
7 7352 t1 7.0
8 2500 t1 6.0
9 3298 t1 8.0

然后 merge通过inner join(参数how='inner'是默认的,所以省略了)同时也是省略了on=['ID','score'] 因为在DataFrames 仅在这两列中通用:

df = pd.merge(df2, df)
print (df)
ID score text_org variable
0 2133 7.0 asdf t0
1 2500 7.0 cccc t0
2 3298 8.0 ytyt t1
3 2133 3.0 qwer t1
4 1234 10.0 pois t0
5 7352 9.0 ijsd t0
6 7352 7.0 bdcs t1
7 3298 10.0 swed t0
8 1234 8.0 zzzz t1
9 2500 6.0 erer t1

最后一次 reshape unstack并通过没有第一列的 df1 设置列名 ([1:]):

df = df.set_index(['ID','variable']).unstack()
df.columns = df1.columns[1:]
print (df)
t0 t1 text0 text1
ID
1234 10.0 8.0 pois zzzz
2133 7.0 3.0 asdf qwer
2500 7.0 6.0 cccc erer
3298 10.0 8.0 swed ytyt
7352 9.0 7.0 ijsd bdcs

通过评论编辑:

你得到:

ValueError: Index contains duplicate entries, cannot reshape

问题是 df2 是否按列 IDscore 重复。

例如新行添加到末尾,它具有与第一行相同的 IDscore(21337.0) - 所以得到重复:

print (df2)
ID score text_org
0 2133 7.0 asdf
1 2500 7.0 cccc
2 3298 8.0 ytyt
3 2133 3.0 qwer
4 1234 10.0 pois
5 7352 9.0 ijsd
6 7352 7.0 bdcs
7 3298 10.0 swed
8 1234 8.0 zzzz
9 2500 6.0 erer
10 2133 7.0 new_val

合并后,您可以检查第一列和第二列 - 对于具有 score 的相同 ID,您会得到 2 个值 - asdfnew_val ,所以报错:

df = pd.merge(df2, df)
print (df)
ID score text_org variable
0 2133 7.0 asdf t0
1 2133 7.0 new_val t0
2 2500 7.0 cccc t0
3 3298 8.0 ytyt t1
4 2133 3.0 qwer t1
5 1234 10.0 pois t0
6 7352 9.0 ijsd t0
7 7352 7.0 bdcs t1
8 3298 10.0 swed t0
9 1234 8.0 zzzz t1
10 2500 6.0 erer t1

解决方案是 pivot_table使用一些聚合函数或删除 df2 中的重复项(例如使用 drop_duplicates ):

#aggregate function is first
df3 = df.pivot_table(index='ID', columns='variable', aggfunc='first')
df3.columns = df1.columns[1:]
print (df3)
t0 t1 text0 text1
ID
1234 10 8 pois zzzz
2133 7 3 asdf qwer
2500 7 6 cccc erer
3298 10 8 swed ytyt
7352 9 7 ijsd bdcs

#aggregate function is last
df4 = df.pivot_table(index='ID', columns='variable', aggfunc='last')
df4.columns = df1.columns[1:]
print (df4)
t0 t1 text0 text1
ID
1234 10 8 pois zzzz
2133 7 3 new_val qwer
2500 7 6 cccc erer
3298 10 8 swed ytyt
7352 9 7 ijsd bdcs

关于python - 在第二个数据框中的值上加入两个数据框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40011943/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com