python - 如何使用 pandas DataFrame 计算列表的字典?
问题描述
我在 Python3.x 中有两个字符串,它们被定义为相同的长度:
string1 = 'WGWFTSJKPGP'
string2 = 'DORKSRQKYJG'
我还得到了一个整数,它表示string2
. 在这种情况下,start_pos = 51
。
目标是根据索引创建字典。所以,string1
开始于0
,string2
开始于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
解决方案
首先应用 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)
推荐阅读
- php - PHP 8.0、mpdf 库 8.0.10 未裁剪但进行缩放
- javascript - 使用 ngx-echarts 注册和使用新的语言环境
- vba - 为什么 CurrentDB 可以在一台计算机上工作,但不能在另一台计算机上工作
- c# - 将另一列的两列datagridview单元格值相乘,然后将所有行的值相加
- database - dbms中多级索引和二级索引的区别
- r - 地图中缺少标记/点
- r - 从图例中删除特定标记
- typescript - 有没有像 JQAssistant 这样的 Typescript 工具
- python - 如何在 django 中将图像添加到数据库中而不在选择的按钮中显示图像的路径
- javascript - 带有没有子路由Angular的链接的面包屑