我有一个向用户提出三点要求的小脚本,我们称它们为A、B和C.我需要将这些数据保存到CSV文件中,如下所示:

,A,B,C
0,a,b,c
1,d,e,f
2,g,h,i

如果A的值已经在CSV上,我需要在与A相同的行上更新值B和C. 如果A的值不在CSV上,我需要在CSV的末尾追加.

因此,如果A的值为d,B的值为x,C的值为y,则CSV应更新为:

,A,B,C
0,a,b,c
1,d,x,y
2,g,h,i

如果A的值是j,B是x,C是y,则CSV应更新为:

,A,B,C
0,a,b,c
1,d,e,f
2,g,h,i
3,j,x,y

到目前为止,这就是我想出的办法,但我想我不知道如何让它变得更好:

def save_data(a, b, c):
    data = {'A': a, 'B': b, 'C': c}
    try:
        df = pd.read_csv('my_data.csv')
        saved_data = df.to_dict(orient='list')
        if a in saved_data['A']:
            position = saved_data['A'].index(a)
            saved_data['B'][position] = b
            saved_data['C'][position] = c
        else:
            first_key = next(iter(saved_data))
            saved_data.pop(first_key)
            for k, v in data.items():
                saved_data[k].append(v)
        df = df.from_dict(saved_data)
        df.to_csv('my_data.csv')

    except FileNotFoundError:
        df = pd.DataFrame([v for _, v in data.items()], columns=['A', 'B', 'C'])
        df.to_csv('my_data.csv')

我try 寻找更优化的解决方案来替换DataFrame上的整行,但找不到我需要做的事情.我想知道我是不是做得太过分了,或者有没有更有效的方法来解决这个问题.

谢谢你的帮助!

推荐答案

使用combine_first更新/附加值的简明解决方案

def update_data(a, b, c):
    df = pd.DataFrame([{'A': a, 'B': b, 'C': c}])
    df = df.set_index('A')

    if os.path.exists('data.csv'):
        old_df = pd.read_csv('data.csv', index_col=['A'])
        df = df.combine_first(old_df)
    
    df.to_csv('data.csv')

样例运行

update_data(1, 2, 3)
# A,B,C
# 1,2,3

update_data(4, 5, 6)
# A,B,C
# 1,2,3
# 4,5,6

update_data(1, 25, 100)
# A,B,C
# 1,25,100
# 4,5,6

update_data(7, 8, 9)
# A,B,C
# 1,25,100
# 4,5,6
# 7,8,9

Python相关问答推荐

如何在Pandas 中存储二进制数?

如何修复fpdf中的线路出血

机器人与Pyton Minecraft服务器状态不和

DuckDB将蜂巢分区插入拼花文件

如何使用Python中的clinicalTrials.gov API获取完整结果?

在Pandas框架中截短至固定数量的列

如果索引不存在,pandas系列将通过索引获取值,并填充值

使用Keras的线性回归参数估计

点到面的Y距离

使用新的类型语法正确注释ParamSecdecorator (3.12)

Pystata:从Python并行运行stata实例

由于NEP 50,向uint 8添加-256的代码是否会在numpy 2中失败?

使用miniconda创建环境的问题

运行总计基于多列pandas的分组和总和

在Pandas DataFrame操作中用链接替换'方法的更有效方法

运输问题分支定界法&

SQLAlchemy Like ALL ORM analog

用砂箱开发Web统计分析

在matplotlib中删除子图之间的间隙_mosaic

如何使用OpenGL使球体遵循Python中的八样路径?