我有一个大空间分隔的输入文件input.csv,它无法保存在内存中:
## Header
# More header here
A B
1 2
3 4如果我将iterator=True参数用于csv,那么它将返回一个TextFileReader / TextParser对象。这允许动态过滤文件,并且只选择列A大于2的行。
但是,如何在不需要再次循环所有数据的情况下,动态地向dataframe添加第三列呢?
具体来说,我希望列C等于A列乘以字典d中的值,字典d的值是B列的键,即C = A*d[B]。
目前我有这样的代码:
import pandas
d = {2: 2, 4: 3}
TextParser = pandas.read_csv('input.csv', sep=' ', iterator=True, comment='#')
df = pandas.concat([chunk[chunk['A'] > 2] for chunk in TextParser])
print(df)它打印此输出:
A B
1 3 4如何让它打印此输出(C = A*d[B]):
A B C
1 3 4 9发布于 2017-03-23 04:53:15
您可以使用生成器一次一个地处理块:
代码:
def on_the_fly(the_csv):
d = {2: 2, 4: 3}
chunked_csv = pd.read_csv(
the_csv, sep='\s+', iterator=True, comment='#')
for chunk in chunked_csv:
rows_idx = chunk['A'] > 2
chunk.loc[rows_idx, 'C'] = chunk[rows_idx].apply(
lambda x: x.A * d[x.B], axis=1)
yield chunk[rows_idx]测试代码:
from io import StringIO
data = StringIO(u"""#
A B
1 2
3 4
4 4
""")
import pandas as pd
df = pd.concat([c for c in on_the_fly(data)])
print(df)结果:
A B C
1 3 4 9.0
2 4 4 12.0https://stackoverflow.com/questions/42962650
复制相似问题