我的数据框如下所示:
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
我想将所有列有效地合并为一个列。我希望每一行都是一个单个字符串。如下所示:
Merged_Column
0 a,1,2,3,4
1 a,3,4,5
2 b,6,7,8
3 c,7,7,7
我见过this question,但由于它正在使用apply函数,因此效率似乎不高。我如何才能做到尽可能高效? (速度+内存使用率)或者应用并不像我所相信的那样麻烦,因为这很简单,而不是熊猫。
这是我尝试过的。看来它正在运行,但是我担心大数据框的速度。
cols= df.columns
df['combined'] = df[cols].apply(func=(lambda row: ' '.join(row.values.astype(str))), axis=1, meta=('str'))
df = df.drop(cols, axis=1)
我还需要摆脱列标题。
答案 0 :(得分:2)
Lambda函数会占用每一行,因此可能会影响处理速度
因此,如果我们按列对操作进行操作,它将很快
df = df.astype(str)
df["Column1"]+","+df["Column2"]+","+df["Column3"]+","+df["Column4"]+","+df["Column5"]
答案 1 :(得分:1)
当您必须加入字符串时,@ saravanan saminathan方法会胜任。 dask
import dask.dataframe as dd
import numpy as np
import pandas as pd
N = int(1e6)
df = pd.DataFrame(np.random.randint(0,100,[N,10]))
df = dd.from_pandas(df, npartitions=4)
df = df.astype("str")
df_bk = df.copy()
%%time
df["comb"] = df.apply(lambda x:",".join(x), axis=1,meta=("str"))
df = df.compute()
CPU times: user 44.4 s, sys: 925 ms, total: 45.3 s
Wall time: 44.6 s
df = df_bk.copy()
%%time
df["comb"] = df[0]+","+df[1]+","+df[2]+","+df[3]+","+df[4]+","+\
df[5]+","+df[6]+","+df[7]+","+df[8]+","+df[9]
df = df.compute()
CPU times: user 8.95 s, sys: 860 ms, total: 9.81 s
Wall time: 9.56 s
如果您有很多列,而又不想全部写下来
df = df_bk.copy()
%%time
df["comb"] = ''
for col in df.columns:
df["comb"]+=df[col]+","
df = df.compute()
CPU times: user 11.6 s, sys: 1.32 s, total: 12.9 s
Wall time: 12.3 s