python - 如何使用 pandas DataFrame 计算列表字典?

标签 python python-3.x pandas dictionary dataframe

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

string1 = 'WGWFTSJKPGP'
string2 = 'DORKSRQKYJG'

我还得到了一个整数,它代表string2的“起始索引”。在本例中,start_pos = 51

目标是根据索引创建一个字典。因此,string10 开始,string251 开始。 “转换”这些坐标的字典如下:

{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

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 结构)。这里,DataFrame df2 具有列 '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

最佳答案

使用 -

def dict_op(x):
    string1 = x['column1']
    string2 = x['column2']
    start_pos = x['start']
    x['val'] = {i: i + start_pos for i, _ in enumerate(string1)}
    return x

def zip_dict(x):
    b=pd.DataFrame(x)
    return {i:b.loc[:,i].tolist() for i in b.columns }

op = df.apply(dict_op, axis=1).groupby('column1')['val'].apply(list).apply(zip_dict)
print(op)

输出

column1
LJNVTJOY      {0: [31, 52, 84], 1: [32, 53, 85], 2: [33, 54,...
MXRBMVQDHF    {0: [79], 1: [80], 2: [81], 3: [82], 4: [83], ...
WHLAOECVQR    {0: [18], 1: [19], 2: [20], 3: [21], 4: [22], ...
Name: val, dtype: object

说明

dict_op 重用您的代码为每一行创建字典,然后 .apply(list) 将这些字典压缩在一起以形成字典列表。

然后,zip_dict() 从临时输出中创建输出 dict

我没有包含的最后一部分是如果列表的长度为 1 则可以仅包含第一个元素,从 {0: [79], 1: [ 80]、2:[81]、3:[82]、4:[83]、...{0: 79, 1: 80, 2: 81, 3: 82, 4 :83,...

关于python - 如何使用 pandas DataFrame 计算列表字典?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52143288/

相关文章:

python - 如何在python中的另外两条线之间插入一条线

python - 更好的算法来随机播放(或交错)多个不同长度的列表

python - 如何使用 Python 3.5 .seek() .txt 文件的结尾

python - 使用自定义变量作为 .rolling() 窗口

python - 从 DataFrame 到嵌套的 Json 对象

python - 使用 Stripe 和 Django 进行定期付款

python - 如何在 Python 中通过管道传输 Python 进程的输出?

python - 当多个子进程使用 `queue.Queue`进行访问时, `concurrent.futures.ProcessPoolExecutor`是线程安全的吗?

python - 我想知道为什么这行得通

python - Pandas - 将应用函数的结果数据帧合并到新的数据帧中