我正在尝试从数据集中的值加入两个数据帧:
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 - 加入,但我还没到任何地方。谢谢你的帮助!
答案 0 :(得分:3)
您可以先使用melt
对drop
个空列text0
和text1
进行重新整形:
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
通过内部联接(参数how='inner'
默认情况下,因此省略)并且省略on=['ID','score']
因为在DataFrames
中只有{2}常见列:
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
最后一次重新整形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:索引包含重复的条目,无法重塑
问题是df2
列是否与ID
列和score
列重复。
e.g。新行添加到结尾,它与第一行ID
和score
具有相同的2133
和7.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
合并后,您可以查看第一列和第二列 - 对于ID
score
asdf
,您获得2个值 - new_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
,因此会收到错误:
df2
解决方案pivot_table
具有一些聚合功能或删除#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
中的重复项(例如使用drop_duplicates
):
for (Song songObj : Song.returnSongs()) {
totalSongCost += Double.parseDouble(songObj.getPrice());
totalSongRating += Integer.parseInt(songObj.getRating());
}