【问题标题】:How to iterate through rows and query specific fields based on the contents of other fields in the same row?如何遍历行并根据同一行中其他字段的内容查询特定字段?
【发布时间】:2019-04-04 04:59:51
【问题描述】:

我已经生成了一个表格数据集,我正在尝试使用 python 以 xls 格式查询并生成报告。我已将数据放入 pandas 数据框中,并将所有可能相关的字段按正确的顺序排列,现在我需要选择每行中的特定列满足特定条件的位置。如果满足该条件,我想包含同一行中的特定字段。我对如何进一步查询这个数据集有点迷茫。

  columns = ['type_1','price_1','color_1','type_2','price_2','color_2','type_3','price_3','color_3' ]

    1'Car','300','Grey','None','None','None,'Truck','500','blue'
    2'Van','250','White','Car','300','Green','Car','350','Black'
    3'None','None','None','None','None','None','None','None','None'
    4'None','None','None''Car','600','Yellow''None','None','None'
    5'Van','250','White','Car','300','Green','Van','250','White'

我想查询此数据集以输出汽车,如果是汽车,则包括价格和颜色。那么如何遍历上面的行并使用 pandas 生成下面的输出呢?

    'Car','300','Grey'
    'Car','300','Green''Car','350','Black'
    'Car','600','Yellow'
    'Car','300','Green'

我觉得这里有两种方法,查询数据集,在不满足所需条件的地方剥离,即:

    df[df.type_1 != 'Car' OR df.type_2 != 'Car' OR df.type_3 != 'Car']

或创建一个新的数据帧并在满足条件时写入/附加到它。

我对 pandas 和它的功能是全新的,因此不胜感激!

【问题讨论】:

  • 如果没有,你想检索哪一列?您有几列
  • 如果你问我,他的预期输出很清楚。
  • @Rarblack 3 列,其中 type= 'Car'。例如,如果 type_1 = 'Car' 给我 'Type_1', 'Price_1', 'Color_1'。

标签: python pandas numpy


【解决方案1】:

这需要几个步骤。

  1. 过滤列基于_1_2_3
  2. 遍历数据框并过滤'Car' 上的type
  3. Concat 将数据帧组合成一个最终数据帧

顺便说一句:我认为您的预期输出应该稍微调整一下才有意义:

df = df.replace("'None'", np.NaN)

df1 = df[df.filter(like='_1').columns]
df2 = df[df.filter(like='_2').columns]
df3 = df[df.filter(like='_3').columns]

dfs = [df1, df2, df3]
dfs_new = []
cntr = 1

for d in dfs:
    dfs_new.append(d[d['type_'+str(cntr)] == "'Car'"])
    cntr += 1

print(pd.concat(dfs_new, axis=1).fillna(''))
  type_1 price_1 color_1 type_2 price_2   color_2 type_3 price_3  color_3
0  'Car'   '300'  'Grey'                                                 
1                         'Car'   '300'   'Green'  'Car'   '350'  'Black'
3                         'Car'   '600'  'Yellow'                        
4                         'Car'   '300'   'Green'                        

注意我可以得到完全一样的预期输出,但这没有意义,因为 type_1type_2 汽车相互重叠,而 type_3 有自己的柱子。

【讨论】:

  • 感谢二凡的帮助。如果有意义的话,我想让输出表左对齐。一旦过滤掉所有内容,它就会看起来像这样。所以以前看起来像这样:X|O|O|O|O O|X|O|O|O X|O|X|O|X 看起来像这样:X X XXX
  • 我不明白你的意思。请发布一个新问题,以便更好地解释。
  • 我无法让您的代码的第一行成功地将“None”替换为 NaN。我也看不出你的语法有问题......你帮助我如此接近!
  • 检查拼写,是'None'还是None。那是有区别的。现在它取代了'None'
  • 成功了。关于 dfs: 循环中的 for d。它抛出一个类型错误:无效的类型比较。这是否意味着我在某处缺少 str() ? df 中的所有列都是字符串。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-10-14
  • 2021-12-05
  • 1970-01-01
  • 2021-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多