如何基于一行中的值和不同的列名合并两个熊猫数据帧?

时间:2018-12-28 16:08:04

标签: python pandas join merge

我有两个要合并的熊猫数据框。数据框的大小不同,因此我只希望保留出现在df1中的那些数据框-一些学生仅出现在df1df2之一中。

df1的标题为['student', 'week1_count', 'week1_mean', ..., 'week11_count', 'week11_mean'],并用'student'列以外的所有单元格初始化为零。

df2具有标题['student', 'week', 'count', 'mean'],并填充有相应的'student''week'是1到11之间的整数,'count''mean'是相应的浮点数。

我想做的是给df1df2中的给定学生,在给定的一周内,取相应的'count''mean'值并放入df1在相应列中。例如,'week'的{​​{1}}值意味着1'count''mean'中的值将被放在df2和{ {1}中的{1}}。

关于我已经遍历'week1_count'并创建子数据集的几周时间,但想知道是否有更快的方法。

'week1_mean'

df1

所以是预期的结果

range(11)

我在熊猫中尝试了各种例程,但都没有按预期工作:

  • 合并: 我希望使用df1: student week1_count week1_mean week2_count week2_mean ... '0' 0 0 0 0 ... '2' 0 0 0 0 ... '3' 0 0 0 0 ... . . . '500' 0 0 0 0 ... '541' 0 0 0 0 ... '542' 0 0 0 0 ... 的格式,所以使用“ left”联接。我尝试重命名df2: student week count mean '0' 1 5 6.5 '1' 1 3 7.0 '2' 1 2 8.2 '2' 2 10 15.1 . . . '500' 2 12 4.3 '540' 4 1 3.0 '542' 1 4 1.2 '542' 2 9 5.2 中的列以匹配列名。
  • 加入
  • concat
  • 更新: 尝试将df_result: student week1_count week1_mean week2_count week2_mean ... '0' 5 6.5 0 0 ... '2' 2 8.2 10 15.1 ... '7' 0 0 0 0 ... . . . '500' 0 0 12 4.3 ... '541' 0 0 0 0 ... '542' 4 1.2 9 5.2 ... 中的所有单元格初始化为df1而不是df2,然后使用df1(在np.nan中重命名cols之后)以预期的方式更新所有nan值一个
  • 试图仅设置值: 即类似0.0之类的东西,但同样不起作用

1 个答案:

答案 0 :(得分:1)

这更像是update问题,而不是 merge

s=df2.pivot(index='student',columns='week',values=['count','mean'])# pivot df2 to format it to df1 like . 
s.columns.map('week{0[1]}_{0[0]}'.format) # modify the column
Out[645]: 
Index(['week1_count', 'week2_count', 'week4_count', 'week1_mean', 'week2_mean',
       'week4_mean'],
      dtype='object')
s.columns=s.columns.map('week{0[1]}_{0[0]}'.format) 

然后我们做update

df1=df1.set_index('student')
df1=df1.update(s)