【问题标题】:How to filter out a first value of a column and then second value and then third and so on till nth using python如何使用python过滤出列的第一个值,然后是第二个值,然后是第三个值,依此类推直到第n个
【发布时间】:2019-12-04 14:04:04
【问题描述】:

我有一个如下的 Excel 文件,其中包含多个信息:

Name        list          company
 x      [xyz,mno,pqr]       xyz 
 y      [abc,rst,hij]       abc
 x      [xyz,mno,pqr]       uvw
 y      [abc,rst,hij]       def
 x      [xyz,mno,pqr]       mno
 y      [abc,rst,hij]       rst

从这个 excel 中,我想在名称列中应用过滤器并获取第一个值,然后想要检查一些东西,然后过滤第二个值等等,我用下面的示例来解释第一个值:

假设我从名称列中过滤了“x”,然后我有 3 行,所以从列表列(水平)中,我需要检查公司列中是否存在所有三个“xyz”、“mno”和“pqr”(垂直)与否。所以,这里“xyz”和“mno”出现在公司列的第一行和第三行,但“pqr”没有出现在任何行中。所以在输出中我想要“pqr”,如下所示:

Name        list          company   Output
 x      [xyz,mno,pqr]       xyz       pqr
 y      [abc,rst,hij]       abc       hij
 x      [xyz,mno,pqr]       uvw       pqr
 y      [abc,rst,hij]       def       hij
 x      [xyz,mno,pqr]       mno       pqr
 y      [abc,rst,hij]       rst       hij

对我来说它看起来很复杂,我无法找到任何代码或解决方案。非常感谢您的帮助。

根据我使用以下代码的建议:

import pandas as pd
import numpy as np


frame=pd.read_excel("Book2.xlsx")

frame_Liste=frame.Liste.values.tolist()
frame_company=frame.company.values.tolist()
frame_col3=[]

for items in frame_Liste:
    frame_col3.append(list(set(items)-set(frame_company)))

frame["output"]=frame_col3

frame.to_excel("df.xlsx", index = False)

但是我得到了输出,但是输出是错误的和奇怪的。我在下面向你展示输出:

Link for Output I got from the above code

【问题讨论】:

  • 用 str.split 检查
  • df['Odd_One'] = df['list'].str.split(',',expand=True)[1] 应该可以工作
  • 您的第二个“x”有列表 [xyz,pqr],公司名称是“uvw”,您的 Odd_number 是“pqr”。公司名称是否有拼写错误,即应该是 xyz 吗?列表中是否可能不包括公司名称?
  • 不,没有错字。列表就是这样,有一个很长的列表,我们需要通过过滤 name 列从中搜索奇数。这就像我们需要通过考虑垂直过滤的名称列从水平列表中搜索奇数。如果您有问题,请告诉我。

标签: python-3.x pandas python-2.7


【解决方案1】:

下次请更具体地说明您的问题,即您在工作表中有数据。另外请注意您的符号,因为“[]”表示python中的列表。因此很混乱。现在,在您写下您的数据在 Excel 工作表中之后,问题就很清楚了

import pandas as pd

data=pd.read_excel("path")
frame_Liste_as_String=frame.Liste.tolist()
frame_Liste=[x.split(',') for x in frame_Liste_as_String]
frame_Company=frame.Company.tolist()
frame_col3=[]
for items in frame_Liste:
    frame_col3.append(list(set(items)-set(frame_Company)))

frame["col3"]=frame_col3

  Name        Liste Company   col3
0    x  xyz,mno,pqr     xyz  [pqr]
1    y  abc,rst,hij     abc  [hij]
2    x  xyz,mno,pqr     uvw  [pqr]
3    y  abc,rst,hij     def  [hij]
4    x  xyz,mno,pqr     mno  [pqr]
5    y  abc,rst,hij     rst  [hij]

应该可以解决你的问题

如果您在 Liste 列中的数据确实在括号中,请将行更改为

frame_Liste=[x.strip('][').split(',') for x in frame_Liste_as_String]

【讨论】:

  • 在运行上述代码时出现错误“ValueError:值的长度与索引的长度不匹配”。你能帮帮我吗?
  • 我也应用了 pd.Series 来避免这个错误,然后代码工作但输出不正确。
  • 当您尝试将不同长度的numpy数组列表分配给数据框时出现错误如果您重复我的示例是否会出现错误?
  • 而不是 frame["Output"]=np.array(frame_col3).flatten() 只是做 frame["Output"]=frame_col3
  • 是的,我仍然没有得到任何输出,并且按照您的示例进行操作后,上述错误即将出现“ValueError:值的长度与索引的长度不匹配”。已将 "frame["Output"]=np.array(frame_col3).flatten()" 更改为 "frame["Output"] = frame_col3" 但未生成输出。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多