【问题标题】:How to update the count column of a pandas DataFrame from multiple DataFrames?如何从多个 DataFrame 更新 pandas DataFrame 的计数列?
【发布时间】:2020-05-26 10:36:10
【问题描述】:

我有一个包含 5 个 CSV 文件的列表,每个文件大小为 7 GB,具有相同的结构,我只需要获取一个具有唯一 ID 的 DataFrame。

结构实际上非常简单,因为每个 CSV 文件仅由 2 列组成,userIDcount 类型为 int 的列。

问题是,一旦我加载第一个 DataFrame,userID 列中的值对于每个用户都是唯一的,以下 DataFrame 可能具有与第一个相同的 userID

如果发生这种情况,我会将两个 count 值相加并只保留两条记录之一。

例如:

df1:

"user"  "count"
  X        3
  Y        4
  Z        8
  W        2

在下面的一个:

df2:

"user"  "count"
  X        2
  W        10
  Z        5
  T        6

在这个例子中,我只用 2 个 DataFrame 来解释这种情况,但在我的例子中,它们是 5 个。我将获得的结果在以下 DataFrame 中进行了描述:

df_res:

"user"  "count"
  X        5
  Y        4
  Z        13
  W        12
  T        6        

到目前为止我尝试的是:

import pandas as pd


users = {}

for path in ["A.csv", "B.csv", "C.csv", "D.csv", "E.csv"]:
    current = pd.read_csv(path)  # here the columns are "user", "counts" and others
    _users = pd.DataFrame(columns=["user", "counts"])
    if users:
        _users = _users.append(users)

    _users = _users.append(current.loc[:, ["user", "counts"]], ignore_index=True)

    users = _users.to_dict(orient='records')

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    您可以在一个数据帧中读取所有单独的 csv 文件,然后 groupby:

    import pandas as pd
    
    all=[]
    for path in ["A.csv", "B.csv"]:
        current = pd.read_csv(path, sep='\s+')
        all.append(current[["user", "counts"]])
    df = pd.concat(all, axis=0, ignore_index=True)
    
    df_res = df.groupby('user', as_index=False).counts.sum()
    

    结果:

      user  counts
    0    T       6
    1    W      12
    2    X       5
    3    Y       4
    4    Z      13
    


    使用dask 更新大型 csv 文件:
    import dask.dataframe as dd
    df = dd.read_csv('*.csv', sep='\s+', usecols=["user", "counts"])
    df_res = df.groupby('user').counts.sum().reset_index().compute()
    

    结果:

      user  counts
    0    W      12
    1    X       5
    2    Y       4
    3    Z      13
    4    T       6
    

    【讨论】:

    • 没那么简单,我之前不这么说,但是文件每个都是 7 GB,所以我认为,对于这个解决方案,我会得到一个MemoryError..跨度>
    • 在这种情况下你应该看看dask
    • 您也可以在每个新的 csv 之后在循环中执行 groupby,这样您就不需要将所有文件都保存在内存中然后再处理它们
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-31
    • 2020-03-18
    相关资源
    最近更新 更多