我正在嘗試將列值加入新列,但我想跳過 nan 值:
df['col'] = 'df['col1'].map(str) ',' df['col2'].map(str) ',' df['col3'].map(str)'
例如,如果 col2 值為 nan,則對應的 col 值變為:
val1,,val3
希望它是:
val1,val3
樣本df:
col1 col2 col3
---------------
val11 nan val13
nan val22 val23
nan nan val33
期望的輸出:
col1 col2 col3 col
---------------------
val11 nan val13 val11,val13
nan val22 val23 val22,val23
nan nan val33 val33
uj5u.com熱心網友回復:
試試這個:
import numpy as np
import pandas as pd
data = {'col1': {0: 'val11', 1: np.nan, 2: np.nan},
'col2': {0: np.nan, 1: 'val22', 2: np.nan},
'col3': {0: 'val13', 1: 'val23', 2: 'val33'}}
df = pd.DataFrame(data)
print(df)
>>>
col1 col2 col3
0 val11 NaN val13
1 NaN val22 val23
2 NaN NaN val33
df['col'] = df.apply(lambda s: s.str.cat(sep=','), axis=1)
print(df)
>>>
col1 col2 col3 col
0 val11 NaN val13 val11,val13
1 NaN val22 val23 val22,val23
2 NaN NaN val33 val33
uj5u.com熱心網友回復:
當您從 csv 檔案讀取資料幀時,請使用:
df.read_csv(path , na_filter=False)
如果您已經有了資料框,那么您可以用nan這種方式替換為空字串:
df = df.fillna('')
更新:
根據我在您的問題中的理解,您只想包含不是nan. 您可以將此陳述句用于要加入的每一列(僅不是nan值):
~df['col1'].isnull()
另一個解決方案:
col您可以在將每個列值聚合到資料框每一行的所需結果列之前添加一個條件:
df['col'] = ""
for index, row in df.iterrows():
if not pd.isnull(row['col1']):
df.at[index,'col'] = f"{row['col1']} "
if not pd.isnull(row['col2']):
df.at[index, 'col'] = f"{row['col2']} "
if not pd.isnull(row['col3']):
df.at[index, 'col'] = f"{row['col3']}"
df.at[index, 'col'] = df.at[index, 'col'].rstrip().replace(" ",",")
uj5u.com熱心網友回復:
單線:
df['col'] = df.agg(lambda x: ','.join(x[~x.isnull()].values), axis=1)
print(df)
輸出:
col1 col2 col3 col
0 val11 NaN val13 val11,val13
1 NaN val22 val23 val22,val23
2 NaN NaN val33 val33
uj5u.com熱心網友回復:
df.apply正如@Oghli 建議的那樣,為我解決了問題:
def joiner():
if x['col1']:
x['col'] = x['col1'].map(str) ','
if x['col2']:
x['col'] = x['col2'].map(str) ','
if x['col3']:
x['col'] = x['col3'].map(str) ','
return x
df = df.apply(joiner, axis=1)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/461323.html
上一篇:根據某些條件將df轉換為字典
