1

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

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 并且每个数组都有多个数组。现在我想更新具有以下行的数据框:

第 1 栏 第 2 栏 第 3 栏 第四栏
一个 2 10
一个 C 3 10

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

第 1 栏 第 2 栏 第 3 栏 第四栏 第五栏
一个 1 10 10
一个 1 10 20
一个 C 1 10 10
一个 C 1 10 20
一个 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 之间的任何行,因此需要更新相应的值。

4

1 回答 1

0

编辑第 2 版:参考字典并选择字典索引 val

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

我创建了字典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 1and的增量为 10 in Col 2,那么您可以这样做。

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

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

于 2021-02-14T05:06:23.993 回答