【问题标题】:How to expand dataframe with a calculated list based on rows in python如何使用基于python中的行的计算列表来扩展数据框
【发布时间】:2022-08-14 00:05:22
【问题描述】:

我有这段代码生成的那种数据

import pandas as pd

def multichoose(n,k):
    if k < 0 or n < 0: return \"Error\"
    if not k: return [[0]*n]
    if not n: return []
    if n == 1: return [[k]]
    return [[0]+val for val in multichoose(n-1,k)] + \\
        [[val[0]+1]+val[1:] for val in multichoose(n,k-1)]

states=[]
for i in range(0,3):
    states=states+multichoose(3,i)
df_states = pd.DataFrame(states,columns=[\'x1\',\'x2\',\'x3\'])
df_states[\'cumsum\']=df_states[\'x1\']+df_states[\'x2\']+df_states[\'x3\']

x1  x2  x3  cumsum
0   0   0   0
0   0   1   1
0   1   0   1
1   0   0   1
0   0   2   2
0   1   1   2
0   2   0   2
1   0   1   2
1   1   0   2
2   0   0   2

我想用这个计算来扩展我的数据

# For example for the first row
# in range of cumsum value + 2
[[x, y] for x in range(df_states[[\'cumsum\']].iloc[0][0]+2) for y in range(df_states[[\'cumsum\']].iloc[0][0]+2)]
    
#output
[[0, 0], [0, 1], [1, 0], [1, 1]]

所以我的预期结果是


x1  x2  x3  cumsum a1 a2
0   0   0   0      0  0
0   0   0   0      0  1
0   0   0   0      1  0
0   0   0   0      1  1
0   0   1   1      0  0
0   0   1   1      0  1
0   0   1   1      0  2
0   0   1   1      1  0
0   0   1   1      1  1
0   0   1   1      1  2
0   0   1   1      2  0
0   0   1   1      2  1
0   0   1   1      2  2
.   .   .   .      .  .
.   .   .   .      .  .

在最终结果中,我需要为所有行实现此扩展

感谢您的帮助<3

    标签: python pandas expand


    【解决方案1】:

    亲爱的trying_to_be_a_dev<

    我希望你一切都好

    import pandas as pd
    
    
    def multichoose(n, k):
        if k < 0 or n < 0: return "Error"
        if not k: return [[0] * n]
        if not n: return []
        if n == 1: return [[k]]
        return [[0] + val for val in multichoose(n - 1, k)] + \
               [[val[0] + 1] + val[1:] for val in multichoose(n, k - 1)]
    
    
    states = []
    for i in range(0, 3):
        states = states + multichoose(3, i)
    df_states = pd.DataFrame(states, columns=['x1', 'x2', 'x3'])
    df_states['cumsum'] = df_states['x1'] + df_states['x2'] + df_states['x3']
    df_states['a1'] = ''
    df_states['a2'] = ''
    
    list1 = []
    for i in range(len(df_states)):
        list1.append([[x, y] for x in range(df_states[['cumsum']].iloc[i][0]+2) for y in range(df_states[['cumsum']].iloc[i][0]+2)])
    
    x = []
    y = []
    for i in range(len(list1)):
        for j in range(len(list1[i])):
            print(list1[i][j][0])
            x.append(list1[i][j][0])
            y.append(list1[i][j][1])
    
    for i in range(len(df_states)):
        df_states['a1'].iloc[i] = x[i]
        df_states['a2'].iloc[i] = y[i]
    
    print(df_states)
    

    当然这不是最好的解决方案,但它对我有用

    希望它也适合你。

    祝你有个愉快的一天。

    【讨论】:

    • 实际上我需要 x1 x2 x3 cumsum a1 a2 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 1 1 而不是 x1 x2 x3 cumsum a1 a2 0 0 0 0 0 0 0 0 1 1 0 1 0 1 0 1 1 0 1 0 0 1 1 1
    【解决方案2】:

    我通过稍微调整 AMIR 的解决方案解决了我的问题。非常感谢阿米尔。

    import pandas as pd
    
    def multichoose(n,k):
        if k < 0 or n < 0: return "Error"
        if not k: return [[0]*n]
        if not n: return []
        if n == 1: return [[k]]
        return [[0]+val for val in multichoose(n-1,k)] + \
            [[val[0]+1]+val[1:] for val in multichoose(n,k-1)]
    
    states=[]
    for i in range(0,3):
        states=states+multichoose(3,i)
    df_states = pd.DataFrame(states,columns=['x1','x2','x3'])
    df_states = df_states.rename_axis('state_num').reset_index()
    df_states['cumsum']=df_states['x1']+df_states['x2']+df_states['x3']
    df_states
    
    list1 = []
    for i in range(len(df_states)):
        list1.append([[x, y] for x in range(df_states[['cumsum']].iloc[i][0]+2) for y in range(df_states[['cumsum']].iloc[i][0]+2)])
    
    df_states['FIFO_LIFO']=list1
    df_states.explode('FIFO_LIFO')
    
        state_num   x1  x2  x3  cumsum  FIFO_LIFO
    0   0           0   0   0   0       [0, 0]
    0   0           0   0   0   0       [0, 1]
    0   0           0   0   0   0       [1, 0]
    0   0           0   0   0   0       [1, 1]
    1   1           0   0   1   1       [0, 0]
    ... ...         ... ... ... ...     ...
    9   9           2   0   0   2       [2, 3]
    9   9           2   0   0   2       [3, 0]
    9   9           2   0   0   2       [3, 1]
    9   9           2   0   0   2       [3, 2]
    9   9           2   0   0   2       [3, 3]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-05-05
      • 2021-03-05
      • 2021-10-19
      • 2011-08-22
      • 1970-01-01
      • 1970-01-01
      • 2020-11-30
      • 2022-12-10
      相关资源
      最近更新 更多