Python 将数据帧与序列合并

Python 将数据帧与序列合并,python,pandas,dataframe,merge,series,Python,Pandas,Dataframe,Merge,Series,我有这个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

我有这个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
合并的数据帧如下所示:

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
当进入第二轮合并时,该系列如下所示:

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
但是合并会变得一团糟,就像这样:

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
有人能帮忙吗?

设置

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  
设置

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  

获得一些@COLDSPEED技巧,并使用concat而不是merge或join,最终奏效了

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

获得一些@COLDSPEED技巧,并使用concat而不是merge或join,最终奏效了

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

我在一个句子里用它。对于第一个,它的结构非常完美,但是更改了系列列的名称,在其中添加了一个“x”(a_x,B_x,等等)。当它转到第二行时,它会创建新的列,在其上添加一个“_y”,第二行的结构正确,但第一行保留了NaNs(我需要它是N/As)@abutemutate是的,我希望你看到我最近的编辑,我显式地重新创建了数据,因此它将完全按照您的问题中的预期工作。@abutemutate如果问题仍然存在,我无法确定问题是什么,除非您向我展示一些重现您的问题的示例数据?实际上出现了另一个问题:ValueError:entry不是2或3元组。我应该编辑添加句子的问题吗?细胞内的数据实际上是不正确的。@abutemutate可能是。一些代码行可以帮助我重现你的数据也会有帮助。我在for语句中使用它。对于第一个,它的结构非常完美,但是更改了系列列的名称,在其中添加了一个“x”(a_x,B_x,等等)。当它转到第二行时,它会创建新的列,在其上添加一个“_y”,第二行的结构正确,但第一行保留了NaNs(我需要它是N/As)@abutemutate是的,我希望你看到我最近的编辑,我显式地重新创建了数据,因此它将完全按照您的问题中的预期工作。@abutemutate如果问题仍然存在,我无法确定问题是什么,除非您向我展示一些重现您的问题的示例数据?实际上出现了另一个问题:ValueError:entry不是2或3元组。我应该编辑添加句子的问题吗?细胞内的数据实际上是不正确的。@abutemutate可能是。一些代码行可以帮助我重现你的数据也会有帮助。