web-dev-qa-db-ja.com

python pandasで複数の列の値を1つの列にマージします

pandasこのようなデータフレームがあります。

   Column1  Column2  Column3  Column4  Column5
 0    a        1        2        3        4
 1    a        3        4        5
 2    b        6        7        8
 3    c        7        7        

ここでやりたいことは、Column1と新しいcolumnAを含む新しいデータフレームを取得することです。このcolumnAには、次のように列2-(to)n(nはColumn2から行の最後までの列数)のすべての値が含まれている必要があります。

  Column1  ColumnA
0   a      1,2,3,4
1   a      3,4,5
2   b      6,7,8
3   c      7,7

どうすればこの問題に最善のアプローチができますか?どんなアドバイスも役立ちます。前もって感謝します!

23
sequence_hard

apply pass axis=1applyに行単位で呼び出してから、dtypeをstrおよびjoinに変換できます。

In [153]:
df['ColumnA'] = df[df.columns[1:]].apply(
    lambda x: ','.join(x.dropna().astype(str)),
    axis=1
)
df

Out[153]:
  Column1  Column2  Column3  Column4  Column5  ColumnA
0       a        1        2        3        4  1,2,3,4
1       a        3        4        5      NaN    3,4,5
2       b        6        7        8      NaN    6,7,8
3       c        7        7      NaN      NaN      7,7

ここでdropnaを削除するためにNaNを呼び出しますが、再度intにキャストする必要があるため、strとしてfloatにならないようにします。

49
EdChum

.assignを使用することを提案します

df2 = df.assign(ColumnA = df.Column2.astype(str) + ', ' + \
  df.Column3.astype(str) + ', ' df.Column4.astype(str) + ', ' \
  df.Column4.astype(str) + ', ' df.Column5.astype(str))

それはシンプルで、おそらく長いですが、それは私のために働いた

4
Amin Salgado

たとえば、データフレームに1000列あり、_particular column name_に基づいていくつかの列をマージしたい場合-_Column2_問題のあり、任意の番号。その列の後の列(たとえば、OPが要求した_'Column2_を含む_Column2_の後の3列).

.get_loc() -回答通り here を使用して列の位置を取得できます

_source_col_loc = df.columns.get_loc('Column2') # column position starts from 0

df['ColumnA'] = df.iloc[:,source_col_loc+1:source_col_loc+4].apply(
    lambda x: ",".join(x.astype(str)), axis=1)

df

Column1  Column2  Column3  Column4  Column5  ColumnA
0       a        1        2        3        4  1,2,3,4
1       a        3        4        5      NaN    3,4,5
2       b        6        7        8      NaN    6,7,8
3       c        7        7      NaN      NaN      7,7
_

NaNを削除するには、 .dropna() または .fillna() を使用します

それが役に立てば幸い!

1
Om Prakash