python dataframe纵向合并_Python Dataframe合并问题

使用Pandas分批次处理大型数据集时,发现合并DataFrame后数据量减少。疑似合并时只保留最大值而非求和。需正确合并重复项。

用Pandas读取一个七百万条记录的微博爬虫文件,大小约1G。直接读入内存不足,于是采用chunksize=100000来分批读取。每个chunk的数据处理后得到count长这样:

daysCount tweetsSum

userID

1294588034 5 305

2277435630 4 284

1985258823 6 265

1886370740 7 265

... ... ...

之后我尝试把这些dataframe合并,代码如下:

count_list=[]

for chunk in data:

...

count_list.append(count)

total_count = pd.concat(count_list, axis=0)

print(total_count.sort_value(by=['tweetsSum'],ascending=False))

结果发现汇总后的数据总是小于真正的数据量,不管是daysCount还是tweetsSum都是。而且调高chunksize,这两个值也会提高。

于是我猜想在concat的时候,遇到userID相同的,它只会取daysCount和tweetsSum的最大值,而不是值相加。

如果是这样的问题的话,那么该怎么合并dataframe,能让碰到userID相同的时候,让daysCount和tweetsSum相加呢?

Python中,实现DataFrame纵向拼接可以使用`pandas`库的`concat`函数。下面为你详细介绍具体的实现方法。 ### 使用`concat`函数进行纵向拼接 `concat`函数可以将多个DataFrame对象沿着指定的轴进行拼接,当`axis=0`时表示纵向拼接。示例代码如下: ```python import pandas as pd # 创建示例DataFrame df1 = pd.DataFrame([['Tom', '2001', 98], ['Jack', '2002', 63], ['Lucy', '2003', 88], ['Nick', '2004', 100]], columns=['姓名', '学号', '成绩']) df2 = pd.DataFrame([['Tom', '2001', '一班'], ['Jack', '2002', '二班'], ['Lucy', '2003', '二班'], ['Anny', '2005', '一班']], columns=['姓名', '学号', '班级']) # 纵向拼接DataFrame result = pd.concat([df1, df2], axis=0) print(result) ``` 在上述代码中,首先创建了两个DataFrame对象`df1`和`df2`,然后使用`pd.concat`函数将它们纵向拼接在一起,最后将拼接结果存储在`result`变量中并打印输出。 ### 使用高阶函数`reduce`进行纵向连接 若要将一个列表中的DataFrame进行纵向连接,可以使用高阶函数`reduce`。示例代码如下: ```python import pandas as pd from functools import reduce def concat_func(x, y): return pd.concat([x, y], axis=0) # axis=0为纵向连接 # 假设有一个DataFrame列表 metrics = [df1, df2] data = reduce(concat_func, metrics) print(data) ``` 在这段代码中,定义了一个`concat_func`函数用于纵向拼接两个DataFrame,接着使用`reduce`函数将列表`metrics`中的所有DataFrame依次进行纵向拼接,最终得到拼接后的结果`data`。 ### `concat`函数的参数说明 `concat`函数的完整语法为: ```python pd.concat(objs, axis=0, join='outer', join_axes=None, ignore_index=False, keys=None, levels=None, names=None, verify_integrity=False) ``` - `objs`:需要拼接DataFrame或Series对象的列表。 - `axis`:拼接的轴,`0`表示纵向拼接,`1`表示横向拼接,默认为`0`。 - `join`:拼接方式,`'outer'`表示取并集,`'inner'`表示取交集,默认为`'outer'`。 - `ignore_index`:是否忽略原索引,若为`True`,则会重新生成索引,默认为`False`。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值