PythonPandas加入

2024-05-18 19:14:25 发布

您现在位置:Python中文网/ 问答频道 /正文

我想用左连接将两个日期框连接在一起,但希望每个匹配的项都连接到结果日期框中的一行。你知道吗

例如

df1:

company, clientid
tesco,   1
argos,   2
MnS,     3

df2:

info, clientid
a,    1
b,    1
c,    1
d,    2
g,    3
z,    5

想要的结果:

company, clientid, info, info, info
tesco,   1,        a,    b,    c
argos,   2,        d
MnS,     3,        g

使用:

pd.merge(df1, df2, on='clientid', how='left')

使df1中的行被复制,以便合并工作,从而创建我所称的uni文件,而不是我所希望的平面文件。你知道吗


Tags: 文件infoonmergeleftcompanyhowpd
1条回答
网友
1楼 · 发布于 2024-05-18 19:14:25

我们可以按“clientid”分组,然后从唯一值创建一个序列,并调用reset\u index。这将创建一个df,其中info列作为我们需要重命名的序数int值。你知道吗

然后我们可以将其合并回原始df:

In [42]:

df_info = df1.groupby('clientid')['info'].unique().apply(pd.Series).reset_index()
info_len = len([col for col in df_info if str(col).isdigit()])
df_info.columns = ['clientid'] + ['info'] * info_len
df_info
Out[42]:
   clientid info info info
0         1    a    b    c
1         2    d  NaN  NaN
2         3    g  NaN  NaN
3         5    z  NaN  NaN
In [43]:

df.merge(df_info, on='clientid', how='left')
Out[43]:
  company  clientid info info info
0   tesco         1    a    b    c
1   argos         2    d  NaN  NaN
2     MnS         3    g  NaN  NaN

对各个groupby操作的分解显示了正在发生的情况:

In [44]:

df1.groupby('clientid')['info'].unique()
Out[44]:
clientid
1           [a, b, c]
2                 [d]
3                 [g]
5                 [z]
Name: info, dtype: object
In [45]:

df1.groupby('clientid')['info'].unique().apply(pd.Series)
Out[45]:
          0    1    2
clientid             
1         a    b    c
2         d  NaN  NaN
3         g  NaN  NaN
5         z  NaN  NaN
In [46]:

df1.groupby('clientid')['info'].unique().apply(pd.Series).reset_index()
Out[46]:
   clientid  0    1    2
0         1  a    b    c
1         2  d  NaN  NaN
2         3  g  NaN  NaN
3         5  z  NaN  NaN

以上代码后面的其余部分应该是自解释的

相关问题 更多 >

    热门问题