【问题标题】:Column of filtered Dataframe results in empty Series过滤数据框的列导致空系列
【发布时间】:2020-03-19 01:04:57
【问题描述】:

我有这段代码 sn-p 的目标是用数据框列的值填充子列表,但只使用与另一列中的某个值匹配的记录。

最后一行最相关,但我添加了框架。

    for key, value in dict1.items():
    if key[0] + "rel" in dict2:
        i = int(key[0])
        name_col = df1.columns[int(value)]
        lists_dict1[i] = df1.loc[df1["header5"] == 1, name_col].tolist()

我的问题是子列表 lists_dict1[i] 最后是空的。 它必须是最后一行(?),因为...

这里是一些我已经测试过的东西的背景:

i = int(key[0]) 单独打印,它可以工作(例如 0 和 2),这也表明 If 语句已激活

name_col = df1.columns[int(value)] 打印了这个,它给了我列的实际名称

print(df1["header5"]) 列存在;预期值(0 或 1)

print(df1.loc[df1["header5"] == 1, name_col].tolist()) 空列表>> 为什么?

print(df1.loc[df1["header5"] == 1, "crit_abs"]) 空系列对象

dict1 {'0ber': '0', '1ber': '1', '2ber': '2', '3ber': '3'}

dict2 {'0rel': '0', '2rel': '2', '1abs': '1', '3abs': 'ja'}

df1(示例;仅用于上下文;没有问题)

df1 = {"header1": ["abc1", "abc2", "abc3"], "header2": [1, 1, 0], "header3": ["def5", "def8", "def2"], "header4": ["ja", "nein", "ja"], "header5": [1, 0, 1]}
df1 = pandas.DataFrame.from_dict(df1)

【问题讨论】:

  • df1 包含什么?如果我使用: import pandas as pd df1Data = [ {'header5': 1, 'crit_abs': 'one'}, {'header5': 0, 'crit_abs': 'zero'} ] df1 = pd.DataFrame(df1Data ) print(df1.loc[df1['header5'] == 1, 'crit_abs']) 我得到:0 one Name: crit_abs, dtype: object(抱歉无法弄清楚如何格式化评论)
  • 谢谢,我编辑了我的问题并为上下文添加了一个 DataFrame(示例)!

标签: python pandas indexing filter conditional-statements


【解决方案1】:

问题可能在于您如何围绕您提供的示例构建代码。以下示例将代码的不同部分串在一起并起作用。你能让这个例子运行吗?

import pandas as pd

df1 = {"header1": ["abc1", "abc2", "abc3"], "header2": [1, 1, 0], "header3": ["def5", "def8", "def2"], "header4": ["ja", "nein", "ja"], "header5": [1, 0, 1]}
df1 = pd.DataFrame.from_dict(df1)

dict1 = {'0ber': '0', '1ber': '1', '2ber': '2', '3ber': '3'}
dict2 = {'0rel': '0', '2rel': '2', '1abs': '1', '3abs': 'ja'}

lists_dict1 = {}

for key, value in dict1.items():
    print('Key (' + key + ') Value (' + value + ')')
    if key[0] + "rel" in dict2:
        i = int(key[0])
        name_col = df1.columns[int(value)]
        print('Detected Valid Name Col = ' + name_col)
        lists_dict1[i] = df1.loc[df1["header5"] == 1, name_col].tolist()

print('Output Lists Dictionary: ' + str(lists_dict1))

当我运行它时,它会返回:

Key (0ber) Value (0)
Detected Valid Name Col = header1
Key (1ber) Value (1)
Key (2ber) Value (2)
Detected Valid Name Col = header3
Key (3ber) Value (3)
Output Lists Dictionary: {0: ['abc1', 'abc3'], 2: ['def5', 'def2']}

如果我提供的示例对您有用,您可能需要查看如何在项目中构建代码。 df1dict1dict2lists_dict1 可能没有事先正确定义,或者它们在之后被覆盖。

如果我给出的示例不起作用,您使用的是什么版本的 pandas?

【讨论】:

  • 谢谢,内森!我试过你的代码,它对我有用!因此,就在有问题的语句(我的 If 语句中的最后一个)之前,我打印了所有相关的对象(2 个字典和 DataFrame),它们都是正确的。然后我将lists_dict1[i] = ...(顺便说一下,这是一个子列表的列表)更改为lists_dict1[i].append(...),这有助于使结果列表不是空的,而是[['Series([], Name: header1, dtype: object)'], [], ['Series([], Name: header3, dtype: object)'], []]。最后使用 .tolist() 会产生一个空列表。过滤肯定有问题...
猜你喜欢
  • 1970-01-01
  • 2017-04-14
  • 2013-06-07
  • 1970-01-01
  • 2018-11-24
  • 1970-01-01
  • 2012-08-18
  • 1970-01-01
  • 2014-04-23
相关资源
最近更新 更多