将Pandas数据框列值合并到新列中

EMC*_*EMC 12 python dataframe pandas

我正在和Pandas一起工作,我有一个数据框,我们可以在其中填充以下三个值中的一个:

ID_1    ID_2    ID_3
abc     NaN     NaN
NaN     def     NaN
NaN     NaN     ghi
NaN     NaN     jkl
NaN     mno     NaN
pqr     NaN     NaN
Run Code Online (Sandbox Code Playgroud)

我的目标是将这三列组合成我数据框中的新列:

ID_1    ID_2    ID_3  Combined_ID
abc     NaN     NaN    abc
NaN     def     NaN    def
NaN     NaN     ghi    ghi
NaN     NaN     jkl    jkl
NaN     mno     NaN    mno
pqr     NaN     NaN    pqr
Run Code Online (Sandbox Code Playgroud)

理想情况下,它只会找到第1列到第3列中存在的任何非空值,但我也可以连接,因为我们应该只为每行填充三个中的一个.谢谢.

df_note = pd.read_csv("NoteIds.csv")
df_note['Combined_ID'] = # ID_1 + ID_2 + ID_3
Run Code Online (Sandbox Code Playgroud)

EdC*_*ica 13

你可以使用求和的属性来连接字符串值,这样你就可以调用fillna并传递一个空的str和调用sum,并将param传递axis=1给row-wise:

In [26]:

df['Combined_ID'] = df.fillna('').sum(axis=1)
df
Out[26]:
  ID_1 ID_2 ID_3 Combined_ID
0  abc  NaN  NaN         abc
1  NaN  def  NaN         def
2  NaN  NaN  ghi         ghi
3  NaN  NaN  jkl         jkl
4  NaN  mno  NaN         mno
5  pqr  NaN  NaN         pqr
Run Code Online (Sandbox Code Playgroud)

如果您只对这3列感兴趣,可以选择它们:

In [39]:

df['Combined_ID'] = df[['ID_1','ID_2','ID_3']].fillna('').sum(axis=1)
df
Out[39]:
  ID_1 ID_2 ID_3 Combined_ID
0  abc  NaN  NaN         abc
1  NaN  def  NaN         def
2  NaN  NaN  ghi         ghi
3  NaN  NaN  jkl         jkl
4  NaN  mno  NaN         mno
5  pqr  NaN  NaN         pqr
Run Code Online (Sandbox Code Playgroud)


Zer*_*ero 3

假设每行可以有多个非 NaN 值。这仍然应该有效。

\n\n
In [43]: df['Combined_ID'] = df.apply(\n                lambda x : ''.join([e for e in x if isinstance(e, basestring)]),\n                      axis=1)\n
Run Code Online (Sandbox Code Playgroud)\n\n

对于每一行,提取字符串项并将它们连接起来。

\n\n
In [44]: df\nOut[44]:\n  ID_1 ID_2 ID_3 Combined_ID\n0  abc  NaN  NaN         abc\n1  NaN  def  NaN         def\n2  NaN  NaN  ghi         ghi\n3  NaN  NaN  jkl         jkl\n4  NaN  mno  NaN         mno\n5  pqr  NaN  NaN         pqr\n
Run Code Online (Sandbox Code Playgroud)\n\n

我喜欢@EdChum 的答案,看起来更具可读性。

\n\n

有趣的是,fillna('').sum(axis=1)对于这种较小的数据,方法的成本很高。

\n\n
In [45]: %timeit df.fillna('').sum(axis=1)\n1000 loops, best of 3: 808 \xc2\xb5s per loop\n\nIn [46]: %timeit df.apply(lambda x : ''.join([e for e in x if isinstance(e, basestring)]), axis=1)\n1000 loops, best of 3: 285 \xc2\xb5s per loop\n
Run Code Online (Sandbox Code Playgroud)\n\n

仅适用于['ID_1','ID_2','ID_3']

\n\n
df[['ID_1','ID_2','ID_3']].apply(lambda_function)\n
Run Code Online (Sandbox Code Playgroud)\n

  • 更快的方法可能是沿行使用“.ffill()”或“.bfill()”,并获取最后/第一行的值。这样可以相当快地处理多个非 NaN 值。 (2认同)