将 pandas DataFrame 与 Series 合并

Posted

技术标签:

【中文标题】将 pandas DataFrame 与 Series 合并【英文标题】:Merging a pandas DataFrame with a Series 【发布时间】:2018-03-14 01:16:24 【问题描述】:

我有这个 df:

             cnpj
0  33062217000185
1  82645144000160

我运行一个创建两个不同系列的函数:

for i in df.cnpj:
    s=peer_comparison(i)
    df=df.merge(peers.to_frame().T, how='left', on='cnpj')

在for语句的第一轮,输出序列是这样的:

s (first round):

A                                  N/A
B                                  N/A
C                                  N/A
cnpj                    33062217000185

合并后的数据框如下所示:

             cnpj   A       B     C
0  33062217000185   N/A   N/A   N/A 
1  82645144000160   NaN   NaN   NaN 

到第二轮合并时,系列是这样的:

s (second round):

A                                  N/A
B                                  N/A
C                                  N/A
cnpj                    82645144000160

但是合并变得一团糟,像这样:

             cnpj   A_x   B_x  C_x  A_y  B_y  C_y
0  33062217000185   N/A   N/A  N/A  NaN  NaN  NaN
1  82645144000160   NaN   NaN  NaN  N/A  N/A  N/A

如果我尝试使用 df.merge(s.to_frame().T.astype('cnpj' : 'int'), how='left',on='cnpj').fillna('') 更改合并,我会收到以下错误:

ValueError: entry not a 2- or 3- tuple

有人可以帮忙吗?

【问题讨论】:

【参考方案1】:

设置

df = pd.DataFrame('cnpj': [33062217000185, 82645144000160])
print(df)
             cnpj
0  33062217000185
1  82645144000160

s = pd.Series(['N/A', 'N/A', 'N/A', 33062217000185], index=['A', 'B', 'C', 'cnpj'])
print(s)
A                  N/A
B                  N/A
C                  N/A
cnpj    33062217000185
dtype: object

使用df.merge,将s转换为数据帧并在此过程中转置。

df.merge(s.to_frame().T\
      .astype('cnpj' : 'int'), how='left').fillna('')
             cnpj    A    B    C
0  33062217000185  N/A  N/A  N/A
1  82645144000160  

【讨论】:

我在 for 语句中使用它。对于第一个它结构完美,但更改系列列的名称,添加一个“_x”(A_x、B_x 等)。当它转到第二个时,它会创建新列,在其上添加一个“_y”,正确构造第二行,但将第一行保留为 NaN(我需要它为 N/As) @abutremutante 是的,我希望你看到我最近的编辑,我明确地重新创建了数据,所以它可以完全按照你的问题的预期工作。 @abutremutante 如果问题仍然存在,我无法确定问题是什么,除非您向我展示一些可以重现您的问题的示例数据? 实际上出现了另一个问题:ValueError: entry not a 2- or 3- tuple。我应该编辑添加 for 句子的问题吗?单元格内的数据实际上是 N/As。 @abutremutante 也许吧。一些有助于我重现您的数据的代码行也会有所帮助。【参考方案2】:

获得一些@COLDSPEED 提示并使用 concat 而不是合并或加入它终于奏效了。

peers=peer_comparison(df.cnpj[0])
for i in df.cnpj[1:]:
    peers2=peer_comparison(i,base_year)
    peers=pd.concat([peers,peers2],axis=1)

df=peers.T

【讨论】:

以上是关于将 pandas DataFrame 与 Series 合并的主要内容,如果未能解决你的问题,请参考以下文章

将 Pandas Multiindexed DataFrame 与 Singleindexed Pandas DataFrame 合并

Pandas:如何将 MultiIndex DataFrame 与单个索引 DataFrame 连接,以及自定义排序

python (八Pandas 表格处理)

将 model.predict() 的结果与原始 pandas DataFrame 合并?

pandas将Series转成DataFrame

pandas将Series转成DataFrame