【问题标题】:Iterating through multiple rows using multiple values from nested dictionary to update data frame in python使用嵌套字典中的多个值遍历多行以更新python中的数据框
【发布时间】:2021-05-17 10:07:21
【问题描述】:

我创建了嵌套字典来为每个组合保留多个值,字典中的示例行如下:-

dict = {'A': {B: array([1,2,3,4,5,6,7,8,9,10]), C: array([array([1,2,3,4,5,6,7,8,9,10],...}}

有多个 As 并且每个数组都有多个数组。现在我想更新具有以下行的数据框:

Col 1 Col 2 Col 3 Col 4
A B 2 10
A C 3 10

在此数据框中,根据 col 3 中的值,我需要创建行,例如 A 和 B 将有两行,然后每行将字典中的第一个值乘以 col 4,例如第一行将相乘从数组中乘以 1,然后再乘以 2,依此类推,输出将如下所示:-

Col 1 Col 2 Col 3 Col 4 Col 5
A B 1 10 10
A B 1 10 20
A C 1 10 10
A C 1 10 20
A C 1 10 30

我可以通过在字典中迭代来访问数组中的所有值,如下所示:-

for i in dict:
    for j in dict[i]:
        dict[i][j]  

但随后无法遍历数据框的每一行以将每个 Col1 和 Col2 组合的值相乘以创建 Col 5。请建议循环遍历 Col 1 和 Col 2 上的数据框并使用的最佳方法字典中的值基于从 col3 到 Col 4 的行数,考虑到 Col 1 和 Col 2 组合有多个值,并且字典对于每个组合有 10 个值。

编辑:

遍历字典很重要,因为每个组合对于简单的解释都有不同的价值,我把它像 1,2...等。但是字典是通过另一个代码创建的,其中每个组合都有不同的值,

例如可以是这样的

"dict = {'A': {B: array([0.5,0.2,3,4,5,6,7,8,9,10]), C: array([array([0.9,0.6,0.2,4,5,6,7,8,9,10],...}}" 

在这种情况下,A 和 B 组合上第一行的 Col4 将乘以 0.5,第二行将乘以 0.2,如果 A 和 C 第一行将乘以 0.9,第二行乘以 0.6,第三行乘以 0.2。

寻求帮助,了解如何遍历字典中的这些值并更新数据框,字典中每个组合都有 10 个值,并且在数据框中,每个组合可以有 0 到 10 之间的任何行,因此相应的值需要是更新了。

【问题讨论】:

  • 字典是否重要,或者您是否试图在数据框中为 Col 1、Col 2 的每个 groupby 获取 10 的倍数?
  • 感谢您的回答,是的,字典很重要,因为每个组合对于简单的解释都有不同的价值,我把它像 1,2...等。但是字典是通过另一个代码创建的,其中每个组合都有不同的值,例如它可以像 "dict = {'A': {B: array([0.5,0.2,3,4,5,6, 7,8,9,10]), C: array([array([0.9,0.6,0.2,4,5,6,7,8,9,10],...}}" 在本例中为 Col4 A 和 B 组合的第一行乘以 0.5,第二行乘以 0.2,如果 A 和 C 第一行乘以 0.9,第二行乘以 0.6,第三行乘以 0.2。
  • 假设 dict 实际上是dict = {'A':{'B':array(....)}}。关键是B 不是变量B
  • 另外请确认C是否定义为'C':np.array([np.array([1,2,3,4,5,6,7,8,9,10])])

标签: python arrays pandas dictionary for-loop


【解决方案1】:

EDIT Ver 2: Reference Dict 和pick dict index val

您创建的字典非常混乱。我假设您想像我展示的那样引用它(而不是 C 中所示的数组数组)。还假设BC 是值而不是变量BC

我创建了字典dct(dict 是python中的保留字),用不同的值表示它选择的是值而不是索引。

import pandas as pd
import numpy as np

dct = {'A': {'B': np.array([.2,.4,.6,.8,1.0,1.2,1.4,1.6,1.8,2.0]),
              'C': np.array([.3,.6,.9,1.2,1.5,1.8,2.1,2.4,2.7,3.0])
             }
        }

c = ['Col 1','Col 2','Col 3','Col 4']
d = [['A','B',2,10], ['A','C',3,10]]

df = pd.DataFrame(d,columns=c)

#repeat the values as per times in Col 3. This will create dups in 1 and 2 
df = df.loc[df.index.repeat(df['Col 3'])]

#Now groupby Col 1 and Col 2 and count the number of times we have Col 3 value
#This will give you index to reference the dictionary
df['Col 5'] = (df.groupby(['Col 1','Col 2'])['Col 3'].transform('cumcount'))

#Using the cumcount as index, pick the value from dict using keys Col 1, Col 2 and index Col 5
df['Col 5'] = df.apply(lambda x: dct[x['Col 1']][x['Col 2']][x['Col 5']],axis=1)
print (df)

这个输出将是:

  Col 1 Col 2  Col 3  Col 4  Col 5
0     A     B      2     10    0.2
0     A     B      2     10    0.4
1     A     C      3     10    0.3
1     A     C      3     10    0.6
1     A     C      3     10    0.9

如果你想将 Col 5 乘以 Col 4 的值,它非常简单。将方程更改为(将 Col 4 乘以字典值的结果):

df['Col 5'] = df.apply(lambda x: x['Col 4'] * dct[x['Col 1']][x['Col 2']][x['Col 5']],axis=1)

这样做的结果将是:

  Col 1 Col 2  Col 3  Col 4  Col 5
0     A     B      2     10    2.0
0     A     B      2     10    4.0
1     A     C      3     10    3.0
1     A     C      3     10    6.0
1     A     C      3     10    9.0

编辑版本 1:不引用字典

如果您只是希望在 Col 5 中为每组 Col 1Col 2 增加 10,那么您可以这样做。

c = ['Col 1','Col 2','Col 3','Col 4']
d = [['A','B',2,10],
['A','C',3,10]]
import pandas as pd
df = pd.DataFrame(d,columns=c)
df = df.loc[df.index.repeat(df['Col 3'])]
df['Col 5'] = (df.groupby(['Col 1','Col 2'])['Col 3'].transform('cumcount')+1)*10
print (df)

这个输出将是:

  Col 1 Col 2  Col 3  Col 4  Col 5
0     A     B      2     10     10
0     A     B      2     10     20
1     A     C      3     10     10
1     A     C      3     10     20
1     A     C      3     10     30

如果您希望 Col 3 的值为 1,则:

df['Col 3'] = 1

这将导致:

  Col 1 Col 2  Col 3  Col 4  Col 5
0     A     B      1     10     10
0     A     B      1     10     20
1     A     C      1     10     10
1     A     C      1     10     20
1     A     C      1     10     30

如果你需要它来引用字典,那么我需要更改代码。

【讨论】:

  • 感谢您的回答,是的,字典很重要,因为每个组合对于简单的解释都有不同的价值,我把它像 1,2...等。但是字典是通过另一个代码创建的,其中每个组合都有不同的值,例如它可以像 "dict = {'A': {B: array([0.5,0.2,3,4,5,6, 7,8,9,10]), C: array([array([0.9,0.6,0.2,4,5,6,7,8,9,10],...}}" 在本例中为 Col4 A 和 B 组合的第一行乘以 0.5,第二行乘以 0.2,如果 A 和 C 第一行乘以 0.9,第二行乘以 0.6,第三行乘以 0.2。
  • 知道了。所以对于 Col A 和 B 中的对,找到 dict 中的值并将 Dict 中的值与 Col 4 相乘。对吗?
  • 查看我的新更新答案。看看这是不是你要找的。​​span>
猜你喜欢
  • 1970-01-01
  • 2021-12-31
  • 1970-01-01
  • 2021-05-04
  • 1970-01-01
  • 2021-10-23
  • 2013-07-21
  • 1970-01-01
相关资源
最近更新 更多