首页 > 解决方案 > 如何使用 pandas DataFrame 计算列表的字典?

问题描述

我在 Python3.x 中有两个字符串,它们被定义为相同的长度:

string1 = 'WGWFTSJKPGP'
string2 = 'DORKSRQKYJG'

我还得到了一个整数,它表示string2. 在这种情况下,start_pos = 51

目标是根据索引创建字典。所以,string1开始于0string2开始于51。“转换”这些坐标的字典如下:

{0: 51, 1: 52, 2: 53, 3: 54, 4: 55, 5: 56, 6: 57, 7: 58, 8: 59, 9: 60, 10: 61}

可以通过以下方式构造(给出上面的变量):

convert_dict = {i: i + start_pos for i, _ in enumerate(string1)}

我目前以 pandas DataFrame 的形式拥有这些数据:

import pandas as pd

dict1 = {'column1':['MXRBMVQDHF', 'LJNVTJOY', 'LJNVTJOY', 'LJNVTJOY', 'WHLAOECVQR'], 'column2':['DPBVNJYANX', 'UWRAWDOB', 'PEKUYUQR', 'WPMLFVFZ', 'CUTQVWHRIJ'], 'start':[79, 31, 52, 84, 18]}

df = pd.DataFrame(dict1)
print(df)
#       column1     column2  start
# 0  MXRBMVQDHF  DPBVNJYANX     79
# 1    LJNVTJOY    UWRAWDOB     31
# 2    LJNVTJOY    PEKUYUQR     52
# 3    LJNVTJOY    WPMLFVFZ     84
# 4  WHLAOECVQR  CUTQVWHRIJ     18

column 中有多个相同字符串的条目column1。在这种情况下,坐标的字典LJNVTJOY应该是:

{0: [31, 52, 84], 1: [32, 53, 85], 2: [33, 54, 86], 3: [34, 55, 87], 
     4: [35, 56, 88], 5: [36, 57, 89], 6: [37, 58, 90], 7: [38, 59, 91]}

我想使用这个 DataFrame 并计算坐标的类似字典。这样的.groupby('column1')声明看起来应该以某种方式使用.apply()?我不确定如何填充这样的字典列表......

这是正确的输出(保持 DataFrame 结构)。此处 DataFramedf2具有如下所示的列'new_column'

df2.new_column
0    {0: 79, 1: 80, 2: 81, 3: 82, 4: 83, 5: 84, 6: ...
1    {0: [31, 52, 84], 1: [32, 53, 85], 2: [33, 54, 86], 3: [34, 55, 87], 4: [35, 56, 88], 5: [36, 57, 89], 6: [37, 58, 90], 7: [38, 59, 91]}
2    {0: 52, 1: 53, 2: 54, 3: 55, 4: 56, 5: 57, 6: ...
Name: new, dtype: object

标签: pythonpython-3.xpandasdictionarydataframe

解决方案


首先应用 groupby 函数将“开始”列聚合为列表

df2 = df.groupby("column1")["start"].apply(list).reset_index()

现在,您可以编写一个函数来创建新的字典列

def create_dict(row):
    new_dict = {}
    for i, j in enumerate(row["column1"]):
        if len(row["start"]) == 1:
            new_dict[i] = row["start"][0]+i
        else:
            for k in row["start"]:
                if i in new_dict:
                    new_dict[i].append(k + i)
                else:
                    new_dict[i] = [k + i]
    return new_dict

最后,将此函数应用于 df2 的所有行

df2["new_column"] = df2.apply(create_dict, axis = 1)

推荐阅读