我有一个数据框df:
Col1 Col2 Col3
0 a1 NaN NaN
1 a2 b1 NaN
2 a3 b3 c1
3 a4 NaN c2
我试过了:
new_df = '[' + df + ']'
new_df['Col4']=new_df[new_df.columns[0:]].apply(lambda x:','.join(x.dropna().astype(str)),axis =1)
df_final = pd.concat([df, new_df['col4']], axis =1)
我正在了解这个:
我一直在寻找一个强大的解决方案来解决这个问题:
我知道没有直接的方法可以做到这一点,数据帧最终将至少有 20k 行,所以这个问题要问其他堆栈人员。
谢谢。
如果您还有其他问题,请告诉我,我可以编辑问题以增加分数。
答案 0 :(得分:2)
您可以为所有列添加 []
,而无需首先使用来自 i
的助手 enumerate
测试的不缺失值:
def f(x):
gen = (y for y in x if pd.notna(y))
return ','.join(y if i == 0 else '['+y+']' for i, y in enumerate(gen))
#f = lambda x: ','.join(y if i == 0 else '['+y+']' for i, y in enumerate(x.dropna()))
df['col4'] = df.apply(f, axis=1)
print (df)
Col1 Col2 Col3 Col4 col4
0 a1 NaN d8 NaN a1,[d8]
1 a2 b1 d3 NaN a2,[b1],[d3]
2 NaN b3 c1 NaN b3,[c1]
3 a4 NaN c2 NaN a4,[c2]
4 NaN NaN c6 d5 c6,[d5]
性能测试:
#test for 25k rows
df = pd.concat([df] * 5000, ignore_index=True)
f1 = lambda x: ','.join(y if i == 0 else '['+y+']' for i, y in enumerate(x.dropna()))
%timeit df.apply(f1, axis=1)
3.62 s ± 21 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
%timeit df.apply(f, axis =1)
475 ms ± 3.92 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
答案 1 :(得分:2)
我不确定你的用例是什么,但你去
df['Col4'] = df.apply(lambda row:", ".join([(val if val[0]=='a' else "["+val+"]") for val in row if not pd.isna(val)]), axis=1)
它通过将行的值与 ", ".join
连接在一起,但前提是它们不是 pd.isna
。它进一步将所有不以 a
开头的内容放在括号中。
不管你想用它做什么,可能有更好的解决方案
答案 2 :(得分:1)
new_col = []
for idx, row in df.iterrows():
val1 = row["Col1"]
val2 = row["Col2"]
val3 = row["Col3"]
new_val2 = f",[{val2}]" if pd.notna(val2) else ""
new_val3 = f",[{val3}]" if pd.notna(val3) else ""
val4 = f"{val1}{new_val2}{new_val3}"
new_col.append(val4)
df["Col4"] = new_col
也许我的答案不是“计算效率最高的”,但是如果您的数据集是 20k 行,它就足够快了! 我觉得我的回答很通俗易懂,也很容易适应不同的场景!