处理熊猫数据框中的列

时间:2021-01-21 13:46:09

标签: python pandas dataframe

我有一个数据框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)

我正在了解这个:

wrong dataframe

我一直在寻找一个强大的解决方案来解决这个问题:

expected resultant frame

我知道没有直接的方法可以做到这一点,数据帧最终将至少有 20k 行,所以这个问题要问其他堆栈人员。

谢谢。

如果您还有其他问题,请告诉我,我可以编辑问题以增加分数。

3 个答案:

答案 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 行,它就足够快了! 我觉得我的回答很通俗易懂,也很容易适应不同的场景!