gpt4 book ai didi

python - 合并 CSV 数据并计算 python pandas 中的单元格值

转载 作者:行者123 更新时间:2023-11-28 16:45:47 31 4
gpt4 key购买 nike

以下链接使用 python 字典解决了一个非常相似的问题 Python: merging dictionaries with lists in lists as values and counting them

我想知道是否可以使用 python pandas 库解决以下问题。我尝试使用合并和加入,但我不确定如何获得所需的结果。

问题如下:

我从 2 个 csv 文件中查字典

dict1 = {'M1': {'H': '1', 'J' : '2'}, 'M2': {'H': '1', 'J' : '2'}, 'M3': {'H': '1', 'J' : '2'}}
dict2 = {'M1': {'H': '4', 'J' : '6'}, 'M2': {'H': '2', 'J' : '5'}, 'M4': {'H': '9', 'J' : '8'}}

所需的输出表:

两个字典中所有键的列表以及两个字典之间匹配键的子字典 [{H,J}] 值的总和

示例:M1 在 dict1 和 dict2 中都存在,所以 M1 的最终输出应该是

final_M1['H'] = 1(来自 dict1['M1'])+ 4(来自 dict2['M1'])= 5

与 M3 类似,M3 仅存在于 dict1 中,因此无需执行任何操作并且必须保留值。

示例输出:

---------------------
M | H | J
---------------------
M1 | 5 | 8
---------------------
M2 | 3 | 7
---------------------
M3 | 1 | 2
---------------------
M4 | 9 | 8

要获得唯一的两个字典集,

keys = set(dict1.keys()).union(dict2.keys())

与上面链接中使用的逻辑类似,使用python字典的解决方案如下所示:

for k in keys:
print "Key:", k
d1val = dict1.get(k, {})
d2val = dict2.get(k, {})
if (len(d1val) == 0):
print "d2val H:", d2val['H']

if (len(d2val) == 0):
print "d1val H:", d1val['H']

if (len(d1val) != 0 and len(d2val) != 0):
print "Test"
print "d1val H:", d1val['H']
print "d2val H:", d2val['H']
print "d1val H + d2val H = ", int(d1val['H']) + int(d2val['H'])
print "***********"

如何在python pandas中实现相同的逻辑?我还想考虑到输入数据集是否在每个文件 10,000 行的范围内,使用 pandas 库进行此类操作是否有效

最佳答案

如果嵌套字典中的值是数字而不是字符串,您可以使用 DataFrame.add 方法。例如:

import pandas as pd

dict1 = {'M1': {'H': 1, 'J' : 2}, 'M2': {'H': 1, 'J' : 2},
'M3': {'H': 1, 'J' : 2}}
dict2 = {'M1': {'H': 4, 'J' : 6}, 'M2': {'H': 2, 'J' : 5},
'M4': {'H': 9, 'J' : 8}}

df1 = pd.DataFrame(dict1).T
df2 = pd.DataFrame(dict2).T

print(df1)

# H J
# M1 1 2
# M2 1 2
# M3 1 2

print(df2)
# H J
# M1 4 6
# M2 2 5
# M4 9 8

print(df1.add(df2, fill_value = 0))

# H J
# M1 5 8
# M2 3 7
# M3 1 2
# M4 9 8

如果您在 csv 文件中显示数据,也许我们可以建议如何读入它,以便值是数字而不是字符串。

或者,您可以在解析 csv 之后将字符串转换为数字:

In [1]: dict1 = {'M1': {'H': '1', 'J' : '2'}, 'M2': {'H': '1', 'J' : '2'}, 'M3': {'H': '1', 'J' : '2'}}

In [2]: dict1 = {key:{k:int(v) for k,v in dct.items()} for key,dct in dict1.items()}

In [3]: dict1
Out[3]: {'M1': {'H': 1, 'J': 2}, 'M2': {'H': 1, 'J': 2}, 'M3': {'H': 1, 'J': 2}}

但我认为最好从一开始就正确解析它,而不是稍后以这种方式对其进行修补。


如果字典同时包含数值和字符串值,那么您可以使用连接将它们组合起来,然后是分组和聚合。例如,

import pandas as pd
import numpy as np

def combine(values):
if any(isinstance(v, basestring) for v in values):
result = values.dropna().tolist()
else:
result = values.sum()
return result

dict1 = { 'M1': {'H': 1, 'J' : 2, 'D' : 'ABC/DEF1.txt'},
'M2': {'H': 1, 'J' : 2, 'D' : 'ABC/DEF2.txt'},
'M3': {'H': 1, 'J' : 2, 'D' : 'ABC/DEF3.txt'} }
dict2 = { 'M1': {'H': 4, 'J' : 6, 'D' : 'ABC/DEF1.txt'},
'M2': {'H': 2, 'J' : 5, 'D' : 'ABC/DEF2.txt'},
'M4': {'H': 9, 'J' : 8, 'D' : 'ABC/DEF3.txt'}}

df1 = pd.DataFrame(dict1).T
df2 = pd.DataFrame(dict2).T
df = df1.join(df2, rsuffix = '_', how = 'outer').T
grouped = df.groupby(lambda label: label.rstrip('_'))
print(grouped.aggregate(combine).T)

产量

                               D  H  J
M1 [ABC/DEF1.txt, ABC/DEF1.txt] 5 8
M2 [ABC/DEF2.txt, ABC/DEF2.txt] 3 7
M3 [ABC/DEF3.txt] 1 2
M4 [ABC/DEF3.txt] 9 8

关于python - 合并 CSV 数据并计算 python pandas 中的单元格值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14020365/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com