首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在迭代csv文件行时,将计算的列添加到熊猫数据栏中?

在迭代csv文件行时,将计算的列添加到熊猫数据栏中?
EN

Stack Overflow用户
提问于 2017-03-22 21:05:25
回答 1查看 939关注 0票数 1

我有一个大空间分隔的输入文件input.csv,它无法保存在内存中:

代码语言:javascript
复制
## 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]

目前我有这样的代码:

代码语言:javascript
复制
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)

它打印此输出:

代码语言:javascript
复制
   A  B
1  3  4

如何让它打印此输出(C = A*d[B]):

代码语言:javascript
复制
   A  B  C
1  3  4  9
EN

回答 1

Stack Overflow用户

发布于 2017-03-23 04:53:15

您可以使用生成器一次一个地处理块:

代码:

代码语言:javascript
复制
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]

测试代码:

代码语言:javascript
复制
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)

结果:

代码语言:javascript
复制
   A  B     C
1  3  4   9.0
2  4  4  12.0
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42962650

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档