python - 添加元组元素,解析为 pandas DataFrame

标签 python pandas

我有几个元组的 Python 列表:

[(0, 61), (1, 30), (5, 198), (4, 61), (0, 30), (5, 200)]
[(1, 72), (2, 19), (3, 31), (4, 192), (6, 72), (5, 75)]
[(3, 12), (0, 51)]
...

这些元组中的每一个都是按照(key, value)格式创建的:

有七个键:0、1、2、3、4、5、6

预期的输出是一个 pandas DataFrame,其中每一列都由键命名:

import pandas as pd
print(df)

0    1    2    3    4    5    6 
91   30   0    0    61   198  0
0    72   19   31   192  75   72
51   0    0    12   0    0    0

现在,我在概念上遇到的问题是,如果它们的键相同,如何添加多个元组“值”。

我可以访问给定列表的这些值,例如

mylist = [(0, 61), (1, 30), (5, 198), (4, 61), (0, 30), (5, 200)]
keys =  [x[0] for x in mylist]

print(keys)
[0, 1, 5, 4, 0, 5]

我不确定如何创建,例如键值对的字典,我可以将其加载到 pandas DataFrame 中

最佳答案

以名称 tups 考虑您的数据

tups = [
    [(0, 61), (1, 30), (5, 198), (4, 61), (0, 30), (5, 200)],
    [(1, 72), (2, 19), (3, 31), (4, 192), (6, 72), (5, 75)],
    [(3, 12), (0, 51)]
]

选项 0
使用 np.bincount 和疯狂的 map 和 zip 和 splats
这是可行的,因为 np.bincount 的前两个参数是位置数组和添加时要使用的可选权重数组。

pd.DataFrame(
    list(map(lambda t: np.bincount(*zip(*t)), tups))
).fillna(0, downcast='infer')

    0   1   2   3    4    5   6
0  91  30   0   0   61  398   0
1   0  72  19  31  192   75  72
2  51   0   0  12    0    0   0

选项 1
在轴级别上使用理解和求和。

pd.Series({
    (i, j, k): v
    for i, row in enumerate(tups)
    for k, (j, v) in enumerate(row)
}).sum(level=[0, 1]).unstack(fill_value=0)

    0   1   2   3    4    5   6
0  91  30   0   0   61  398   0
1   0  72  19  31  192   75  72
2  51   0   0  12    0    0   0

选项 2
您可以在使用 defaultdict 的结果上使用 DataFrame 构造函数:

from collections import defaultdict

d = defaultdict(lambda: defaultdict(int))

for i, row in enumerate(tups):
    for j, v in row:
        d[j][i] += v

pd.DataFrame(d).fillna(0, downcast='infer')

    0   1   2   3    4    5   6
0  91  30   0   0   61  398   0
1   0  72  19  31  192   75  72
2  51   0   0  12    0    0   0

选项 3
创建一个零数据帧并通过迭代更新它

n, m = len(tups), max(j for row in tups for j, _ in row) + 1

df = pd.DataFrame(0, range(n), range(m))

for i, row in enumerate(tups):
    for j, v in row:
        df.at[i, j] += v

df

    0   1   2   3    4    5   6
0  91  30   0   0   61  398   0
1   0  72  19  31  192   75  72
2  51   0   0  12    0    0   0

关于python - 添加元组元素,解析为 pandas DataFrame,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49202426/

相关文章:

python - Pandas 合并行,对每列进行不同的操作

python - 创建 Json 输出 Boto3

python - 将对象转换为指向对象的指针?

python - Pandas - 遍历 2 列(纬度和经度)并找到每个坐标与特定位置之间的距离

python - 如果值位于列表中,则将条件列添加到数据框

python - 如何将 DataFrame 单元格中的部分字符串转换为要过滤的数字?

python - Pygame 删除背景图像

python - 生成器函数中的 itertools.takewhile - 为什么只评估一次?

python - 数据增强映射函数中的 Tensorflow 随机数

python - Pandas df 操作 : new column with list of values if other column rows repeated