【问题标题】:how to slice a pandas data frame with for loop in another list?如何在另一个列表中使用 for 循环对 pandas 数据框进行切片?
【发布时间】:2021-04-09 09:13:50
【问题描述】:

我有一个这样的数据框,但它不一定只有 3 个站点

data = [[501620, 501441,501549], [501832, 501441,501549], [528595, 501662,501549],[501905,501441,501956],[501913,501441,501549]]
df = pd.DataFrame(data, columns = ["site_0", "site_1","site_2"])

我想切片可以动态地从 li(list) 元素和随机组合中获取条件的数据帧。 我试过下面的静态代码:

li = [1,2]
random_com = (501620, 501441,501549)
df_ = df[(df["site_"+str(li[0])] == random_com[li[0]]) & \
            (df["site_"+str(li[1])] == random_com[li[1]])]

如何使上述代码动态化?

我已经尝试过了,但它给了我两个不同的数据帧,但我需要一个同时具有两个条件 (AND) 的数据帧。

 [df[(df["site_"+str(j)] == random_com[j])] for j in li]

【问题讨论】:

    标签: python python-3.x pandas for-loop


    【解决方案1】:

    您可以对条件进行迭代并创建所有条件的&

    li = [1,2]
    main_mask = True
    for i in li:
        main_mask = main_mask & (df["site_"+str(i)] == random_com[i])
    df_ = df[main_mask]
    

    【讨论】:

    • 我有一个问题,如果我有多个站点,我的意思是没必要每次只有三个?
    • 您可以添加任意数量的条件。您可能需要使用另一个 for 循环并将条件添加为 df["site_"+str(j) == <something>]
    【解决方案2】:

    如果你更喜欢单行,我想你可以使用reduce()

    df_ = df[reduce(lambda x, y: x & y, [(df["site_"+str(j)] == random_com[j]) for j in li])]
    

    【讨论】:

    • 它给了我 keyError 1
    • @NiraliKhoda 通过在您的代码中使用df[j],要检索什么?
    • 我需要切片数据框@Ynjxsjmh
    • @NiraliKhoda 切片什么?列还是行?
    • @NiraliKhoda 老实说,我只是将您帖子中的[df[(df["site_"+str(j)] == df[j])] for j in li] 翻译成reduce() 版本。我没有测试它,不知道你想要什么。如果原版有效,这也应该有效。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-01
    • 1970-01-01
    • 2017-06-03
    • 2018-08-23
    • 1970-01-01
    • 2022-01-06
    相关资源
    最近更新 更多