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
どうすればこの問題に最善のアプローチができますか?どんなアドバイスも役立ちます。前もって感謝します!
apply
pass axis=1
をapply
に行単位で呼び出してから、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にならないようにします。
.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))
それはシンプルで、おそらく長いですが、それは私のために働いた
たとえば、データフレームに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()
を使用します
それが役に立てば幸い!