Pandas 列列表到索引列表中,考虑零和重复

Pandas column of lists into index list accounting for zeros and duplicates

提问人:apk19 提问时间:10/18/2023 更新时间:10/18/2023 访问量:42

问:

我有一个数据帧,其中包含一列带有零和重复值的列表,并尝试创建另一列,其相应的顺序值按升序排列,但通过以下方式考虑零:

  • 将原始列表中的任何零作为顺序列表中的零
  • 对于大于零的第一个数字,顺序列表中的值从 1 开始
  • 任何重复值都会被分配一个相等的顺序值,但会跳过下一个值或多个值。例如。如果有 2 个重复项,则下一个值为 +2,如果有 3 个重复项,则下一个值为 +3,依此类推。

到目前为止的代码:

df = pd.DataFrame({'original_list': [[1.8, 8.3, 8.6, 20.8, 34.7, 8.6, 5.7, 29.7], [0, 1, 2, 2, 2, 4, 6, 7, 0, 3, 3]]})

df['order_list'] = df['original_list'].apply(lambda x: [0 if elem == 0 else sorted(range(len(x)), key=lambda i: (x[i], i))[:x.count(elem)].index(x.index(elem)) + 1 for elem in x])

输出:

0              [0, 2, 3, 5, 7, 3, 1, 6]
1    [0, 2, 3, 3, 3, 8, 9, 10, 0, 6, 6]

期望输出:

0              [1, 3, 4, 6, 8, 4, 2, 7]
1     [0, 1, 2, 2, 2, 7, 8, 9, 0, 5, 5]

问题在于确保订单值从 1 开始,并考虑有零的列表,因为订单从 0 +(零的数量)开始。

Python 熊猫 列表

评论

0赞 Panda Kim 10/18/2023
难以理解逻辑。请说明逻辑是如何应用于每个示例的,以便我们理解为什么您的输入 t 是所需的输出。

答:

0赞 apk19 10/18/2023 #1

设法通过对列表中不为零的元素求和来实现这一点,并处理元素存在重复项并且仅计算出现在当前元素之前的重复项的情况。

df = pd.DataFrame({'original_list': [[1.8, 8.3, 8.6, 20.8, 34.7, 8.6, 5.7, 29.7], [0, 1, 2, 2, 2, 4, 6, 7, 0, 3, 3]]})
df['order_list'] = df['original_list'].apply(lambda x: [0 if elem == 0 else sum(1 for i in x if i < elem and i != 0 or (i == elem and x.index(i) < x.index(elem))) + 1 for elem in x])

输出:

0              [1, 3, 4, 6, 8, 4, 2, 7]
1     [0, 1, 2, 2, 2, 7, 8, 9, 0, 5, 5]
0赞 Tusher 10/18/2023 #2

只需修改 lambda 函数即可获得所需的输出。

import pandas as pd

df = pd.DataFrame({'original_list': [[1.8, 8.3, 8.6, 20.8, 34.7, 8.6, 5.7, 29.7], [0, 1, 2, 2, 2, 4, 6, 7, 0, 3, 3]]})

df['order_list'] = df['original_list'].apply(lambda x: [0 if elem == 0 else sorted(range(len(x)), key=lambda i: (x[i], i)).index(x.index(elem)) + 1 for elem in x])

def adjust_order(order_list):
    order_adjusted = []
    zero_count = order_list.count(0)
    for order in order_list:
        if order == 0:
            order_adjusted.append(0)
        else:
            order_adjusted.append(order + zero_count)
            zero_count = 0
    return order_adjusted

df['order_list'] = df['order_list'].apply(adjust_order)
print(df['order_list'])

输出:

0              [1, 3, 4, 6, 8, 4, 2, 7]
1     [0, 1, 2, 2, 2, 7, 8, 9, 0, 5, 5]

创建原始订单列表后,我定义了函数 adjust_order,该函数将订单值修改为从 1 开始,对于零以上的第一个数字,并考虑列表中的零数量。