Chr*_*her 5 python pandas dask
我有一个较大的熊猫数据框(磁盘上有 1.5gig .csv)。我可以将其加载到内存中并进行查询。我想创建一个新列,它是其他两列的组合值,我试过这个:
def combined(row):
row['combined'] = row['col1'].join(str(row['col2']))
return row
df = df.apply(combined, axis=1)
Run Code Online (Sandbox Code Playgroud)
这导致我的 python 进程被杀死,大概是因为内存问题。
该问题的一个更迭代的解决方案似乎是:
df['combined'] = ''
col_pos = list(df.columns).index('combined')
crs_pos = list(df.columns).index('col1')
sub_pos = list(df.columns).index('col2')
for row_pos in range(0, len(df) - 1):
df.iloc[row_pos, col_pos] = df.iloc[row_pos, sub_pos].join(str(df.iloc[row_pos, crs_pos]))
Run Code Online (Sandbox Code Playgroud)
这当然看起来非常 unpandas。而且速度很慢。
理想情况下,我想要类似于apply_chunk()
apply 的东西,但只适用于数据框的一部分。我认为这dask
可能是一个选择,但是dask
当我使用数据框时,它们似乎还有其他问题。不过,这必须是一个常见问题,是否应该使用一种设计模式将列添加到大熊猫数据框?
我会尝试使用列表理解+ itertools
:
df = pd.DataFrame({
'a': ['ab'] * 200,
'b': ['ffff'] * 200
})
import itertools
[a.join(b) for (a, b) in itertools.izip(df.a, df.b)]
Run Code Online (Sandbox Code Playgroud)
它可能是“unpandas”,但 pandas 似乎没有.str
可以帮助您的方法,而且它也不是“unpythonic”。
要创建另一列,只需使用:
df['c'] = [a.join(b) for (a, b) in itertools.izip(df.a, df.b)]
Run Code Online (Sandbox Code Playgroud)
顺便说一句,您还可以使用以下方法进行分块:
[a.join(b) for (a, b) in itertools.izip(df.a[10: 20], df.b[10: 20])]
Run Code Online (Sandbox Code Playgroud)
如果您想玩并行化。我会首先尝试上面的版本,因为列表理解和 itertools 通常速度快得惊人,而且并行化需要的开销需要被抵消。
归档时间: |
|
查看次数: |
823 次 |
最近记录: |