python - 连接数据帧的片段

标签 python pandas dataframe join merge

我正在尝试将一个数据帧的片段与另一个数据帧的片段连接起来。要连接的数据帧的结构简化如下:

left:
ID    f1   TIME
1     10     1
3     10     1
7     10     1
9     10     2
2     10     2
1     10     2
3     10     2

right:
ID    f2    f3
1      0    11
7      9    11

我需要按时间选择左侧的数据集,并且需要附加右侧的数据集,我想要的结果如下:

left:
ID    f1   TIME  f2     f3
1     10     1    0     11
3     10     1  nan    nan
7     10     1    9     11
9     10     2  nan    nan
2     10     2  nan    nan
1     10     2  nan    nan
3     10     2  nan    nan

目前我通常以这种方式加入数据帧:

left = left.join(right.set_index('ID'), on='ID')

在本例中我使用:

left[left.TIME == 1] = left[left.TIME == 1].join(right.set_index('ID'), on='ID')

我也尝试过合并,但结果是左侧数据框没有任何其他列。 最后,我的脚本结构需要对数据框中的每个唯一时间执行此操作,因此:

 for t in numpy.unique(left.TIME):
     #do join on the fragment left.TIME == t

如果我将连接函数返回的值保存在新的数据框中,一切正常,但尝试在左侧数据框中添加值不起作用。

编辑:左侧数据集的 ID 可以出现多次,但不能出现在同一 TIME 值内。

最佳答案

您可以先按 boolean indexing 进行过滤、合并concat最后:

df1 = left[left['TIME']==1]
#alternative
#df1 = left.query('TIME == 1')
df2 = left[left['TIME']!=1]
#alternative
#df2 = left.query('TIME != 1')

df = pd.concat([df1.merge(right, how='left'), df2])
print (df)
   ID  TIME  f1   f2    f3
0   1     1  10  0.0  11.0
1   3     1  10  NaN   NaN
2   7     1  10  9.0  11.0
3   9     2  10  NaN   NaN
4   2     2  10  NaN   NaN
5   1     2  10  NaN   NaN
6   3     2  10  NaN   NaN

编辑:合并创建默认索引,因此可能的解决方案是先创建列,然后设置为索引:

print (left)
    ID  f1  TIME
10   1  10     1
11   3  10     1
12   7  10     1
13   9  10     2
14   2  10     2
15   1  10     2
16   3  10     2

#df = left.merge(right, how='left')
df1 = left[left['TIME']==1]

df2 = left[left['TIME']!=1]
df = pd.concat([df1.reset_index().merge(right, how='left').set_index('index'), df2])
print (df)
    ID  TIME  f1   f2    f3
10   1     1  10  0.0  11.0
11   3     1  10  NaN   NaN
12   7     1  10  9.0  11.0
13   9     2  10  NaN   NaN
14   2     2  10  NaN   NaN
15   1     2  10  NaN   NaN
16   3     2  10  NaN   NaN

编辑:

经过讨论修改输入数据后可以使用:

df = left.merge(right, how='left', on=['ID','TIME'])

关于python - 连接数据帧的片段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49873535/

相关文章:

python - 如何结合两个直方图python

python - 如何从现有的 Numpy 数组创建 Numpy 数组

python - numpy ndarray 到 Pandas 数据框

python - Pandas hub_table 多个 aggfunc 带边距

python - for-loop 根据 pandas 数据帧定义生成 'cannot insert {}, already exists' 错误

Python Django 获取用户输入

python - 在 numba 中使用多线程

python - 访问动态创建的数据框

python - pandas data frame的每个元素的值如何存储在redis中

python - 根据使用 Pandas 保留其他列值的列对 DataFrame 中的日期进行排序