如何将数据框与包含逗号分隔值的另一个数据框组合?

时间:2017-09-28 20:06:20

标签: python-3.x pandas dataframe

我正在处理基于Excel文件创建的2个数据框。一个数据框包含用逗号分隔的值,即

     df1            df2
-----------      ------------
0   LFTEG42         X,Y,Z
1   JOCOROW         1,2
2   TLR_U01         I
3   PR_UDG5         O,M

df1和df2是我的列名。我的目的是合并两个数据帧并生成以下输出:

 desired result
 ----------
0 LFTEG42X
1 LFTEG42Y
2 LFTEG42Z
3 JOCOROW1
4 JOCOROW2
5 TLR_U01I
6 .....
n PR_UDG5M

这是我使用的代码,但我最终得到了以下结果:

input_file = pd.ExcelFile \
    ('C:\\Users\\devel\\Desktop_12\\Testing\\latest_Calculation' + str(datetime.now()).split(' ')[0] + '.xlsx')

# convert the worksheets to dataframes
df1   = pd.read_excel(input_file, index_col=None, na_values=['NA'], parse_cols="H",
                                          sheetname="Analysis")
df2 = pd.read_excel(input_file, index_col=None, na_values=['NA'], parse_cols="I",
                                        sheetname="Analysis")

data_frames_merged = df1.append(df2, ignore_index=True)


current result
--------------
NaN      XYZ
NaN      1,2
NaN      I
...      ...
PR_UDG5  NaN

问题

  1. 为什么我最终收到NaN(非数字)值?
  2. 如何使用逗号值实现将这两个数据框合并的预期结果?

4 个答案:

答案 0 :(得分:4)

我打破了步骤

double

数据输入:

df=pd.concat([df1,df2],axis=1)
df.df2=df.df2.str.split(',')

df=df.set_index('df1').df2.apply(pd.Series).stack().reset_index().drop('level_1',1).rename(columns={0:'df2'})
df['New']=df.df1+df.df2
df
Out[34]: 
       df1 df2       New
0  LFTEG42   X  LFTEG42X
1  LFTEG42   Y  LFTEG42Y
2  LFTEG42   Z  LFTEG42Z
3  JOCOROW   1  JOCOROW1
4  JOCOROW   2  JOCOROW2
5  TLR_U01   I  TLR_U01I
6  PR_UDG5   O  PR_UDG5O
7  PR_UDG5   M  PR_UDG5M

答案 1 :(得分:3)

肮脏的单行

new_df = pd.concat([df1['df1'], df2['df2'].str.split(',', expand = True).stack()\
.reset_index(1,drop = True)], axis = 1).sum(1)


0    LFTEG42X
0    LFTEG42Y
0    LFTEG42Z
1    JOCOROW1
1    JOCOROW2
2    TLR_U01I
3    PR_UDG5O
3    PR_UDG5M

答案 2 :(得分:2)

此外,类似于@vaishali,除了使用融化

df = pd.concat([df1,df2['df2'].str.split(',',expand=True)],axis=1).melt(id_vars='df1').dropna().drop('variable',axis=1).sum(axis=1)

0    LFTEG42X
1    JOCOROW1
2    TLR_U01I
3    PR_UDG5O
4    LFTEG42Y
5    JOCOROW2
7    PR_UDG5M
8    LFTEG42Z

答案 3 :(得分:2)

设置

df1.A.repeat(df2.A.str.count(',') + 1) + ','.join(df2.A).split(',')

0    LFTEG42X
0    LFTEG42Y
0    LFTEG42Z
1    JOCOROW1
1    JOCOROW2
2    TLR_U01I
3    PR_UDG5O
3    PR_UDG5M
dtype: object

获得创意

checkout--setup--tests--deploy--post deploy stuff