Python 如何处理修改大熊猫数据帧

Python 如何处理修改大熊猫数据帧,python,pandas,dask,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) 这导致我的python进程被终止,可能是因为内存问题 该问题的一个更迭代的解决方案似乎是: df['combi

我有一个较大的熊猫数据帧(磁盘上有1.5gig.csv)。我可以将它加载到内存并查询它。我想创建一个新列,它是其他两列的组合值,我尝试了以下方法:

def combined(row):
    row['combined'] = row['col1'].join(str(row['col2']))
return row

df = df.apply(combined, axis=1)
这导致我的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]))
这当然看起来很不像话。而且速度很慢


理想情况下,我想要类似于
apply\u chunk()
的东西,它与apply相同,但只适用于数据帧的一部分。我认为
dask
可能是一个选项,但是
dask
数据帧在使用时似乎有其他问题。这是一个常见的问题,我是否应该使用设计模式向大熊猫数据帧添加列?

我会尝试使用列表理解+:

它可能是“unpandas”,但pandas似乎没有一个
.str
方法来帮助您,它也不是“unpythonic”

要创建另一列,只需使用:

df['c'] = [a.join(b) for (a, b) in itertools.izip(df.a, df.b)]
顺便说一句,您还可以使用以下方法进行分块:

[a.join(b) for (a, b) in itertools.izip(df.a[10: 20], df.b[10: 20])]

如果你想玩并行化。我会首先尝试上面的版本,因为列表理解和itertools的速度通常出奇地快,而并行化需要的开销可能会超过它。

在or中创建新列的一个好方法是使用该方法


然而,如果您的操作是高度定制的(看起来是这样),并且Python迭代器足够快(看起来是这样),那么您可能只想坚持使用它。每当您发现自己在循环中使用
apply
iloc
时,Pandas的运行速度可能比最佳运行速度慢得多。

首先,
dask
对您的情况没有帮助,因为您的问题是I/O和内存受限,而不是CPU受限,而
dask
基于
多处理
模块。dask可以使用线程、多处理或分布式计算。在他的情况下,虽然他不需要这些,但仅仅是一种智能处理来自磁盘的流数据的方法。使用apply方法有什么用?哇。这是难以置信的令人麻木的速度。使用python3,我得到的结果是:
df['course\u combined']=[str(a).join(b)for(a,b)in itertools.zip\u longest(df['col1],df['col2'])]
Pandas肯定在iloc中做了一些非常低效的事情,我会认为这是一种快速但丑陋的数据帧迭代方式。
[a.join(b) for (a, b) in itertools.izip(df.a[10: 20], df.b[10: 20])]
In [1]: import pandas as pd

In [2]: df = pd.DataFrame({'x': [1, 2, 3, 4], 'y': ['a', 'b', 'a', 'b']})

In [3]: df
Out[3]: 
   x  y
0  1  a
1  2  b
2  3  a
3  4  b

In [4]: df.assign(z=df.x * df.y)
Out[4]: 
   x  y     z
0  1  a     a
1  2  b    bb
2  3  a   aaa
3  4  b  bbbb