鱼C论坛

 找回密码
 立即注册
查看: 2712|回复: 15

[已解决]关于pands进行CSV文件的处理

[复制链接]
发表于 2021-6-26 17:27:01 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
CSV文件中若存在为0的数,则将其改为同一行前三个数的平均值,如果一列全部为零则不用考虑,想问下大佬这个该怎么实现
最佳答案
2021-6-26 17:57:51


import pandas as pd

df = pd.read_csv(你的文件)
result = []
for i in df.values:
    if 0 in i and set(i) != {0}:
        avg = sum(i[:3])/3
        for j in range(len(i)):
            if i[j] == 0:
                i[j] = avg
    result.append(i)

new_df = pd.DataFrame(result)
new_df.columns = df.columns

new_df.to_csv('Result.csv', index=False)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-6-26 20:25:12 | 显示全部楼层
烟火气 发表于 2021-6-26 20:12
代码运行了一遍,发现并不能过滤掉一列全为0的数据




这样呢:
import pandas as pd

df = pd.read_csv(你的文件)
key = [key for key,sum in zip(df.keys(),df.sum()) if sum == 0]

result = []
for i in df.values:
    if 0 in i and set(i) != {0}:
        avg = sum(i[:3])/3
        for j in range(len(i)):
            if df.keys()[j] in key:
                continue
            elif i[j] == 0:
                i[j] = avg
    result.append(i)

new_df = pd.DataFrame(result)
new_df.columns = df.columns

new_df.to_csv('Result.csv', index=False)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-6-26 17:29:39 | 显示全部楼层


你 CSV 文件的样式大致发下

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-6-26 17:42:38 | 显示全部楼层
Twilight6 发表于 2021-6-26 17:29
你 CSV 文件的样式大致发下


                               
登录/注册后可看大图
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-6-26 17:47:04 | 显示全部楼层
Twilight6 发表于 2021-6-26 17:29
你 CSV 文件的样式大致发下


                               
登录/注册后可看大图
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-6-26 17:57:51 | 显示全部楼层    本楼为最佳答案   


import pandas as pd

df = pd.read_csv(你的文件)
result = []
for i in df.values:
    if 0 in i and set(i) != {0}:
        avg = sum(i[:3])/3
        for j in range(len(i)):
            if i[j] == 0:
                i[j] = avg
    result.append(i)

new_df = pd.DataFrame(result)
new_df.columns = df.columns

new_df.to_csv('Result.csv', index=False)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-6-26 18:05:27 | 显示全部楼层
Twilight6 发表于 2021-6-26 17:29
你 CSV 文件的样式大致发下

[img]https://imgtu.com/i/RGmLVJ https://imgtu.com/i/RGmbb4[/img]
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-6-26 18:06:16 | 显示全部楼层


                               
登录/注册后可看大图
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-6-26 18:07:01 | 显示全部楼层


                               
登录/注册后可看大图


报错没太看懂
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-6-26 18:11:54 | 显示全部楼层



没有找到文件,你文件路径、文件名需要填写正确,文件要后缀

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-6-26 18:24:57 | 显示全部楼层
import pandas as pd
df = pd.DataFrame({'A':[1, 2, 3], 'B':[2, 4, 8], 'C':[3, 3, 7], 'D':[1, 0, 0]})  # 仅示例(读取你csv,操作对应列即可)
# df
# 方法思路:
df[df.D == 0][['A', 'B', 'C']]  # 根据第四列是否0过滤出的需要的数据
df[df.D == 0][['A', 'B', 'C']].mean(axis=1) # 对过滤出的数据求平均(横向)

# 两行搞定:
if df.D.sum() != 0:  # 若第四列不全为0,则求各前三个数的平均
    df.D[df.D==0] = df[df.D==0][['A','B','C']].mean(axis=1) 

df 
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-6-26 20:12:55 | 显示全部楼层

代码运行了一遍,发现并不能过滤掉一列全为0的数据
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-6-26 21:35:44 | 显示全部楼层

这样就过滤了,感谢大佬解难
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-6-26 21:41:46 | 显示全部楼层

思路清晰,但是萌新没太看懂
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-6-27 00:07:12 | 显示全部楼层
烟火气 发表于 2021-6-26 21:41
思路清晰,但是萌新没太看懂

基本的过滤操作(如df[df.D==0])、
多列选取操作,单列修改值等操作,这看不懂,那我也没办法。。

ps: df.D 即 df['D'] ;  df['A'] 返回的是Series, df[ ['A'] ]返回的是 DataFrame;
.sum(), .mean()等统计函数,默认是"纵向"统计,即axis=0或axis='index';
当指定axis=1即“横向统计”,统计每行的sum和,或mean平均值
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-6-27 06:29:23 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-15 06:51

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表