【问题标题】:Subset a data frame according to pattern matches in a file.txt pandas根据 file.txt pandas 中的模式匹配对数据框进行子集
【发布时间】:2019-08-10 06:10:47
【问题描述】:

我有一个数据框,比如

query   subject col1
A   dog ok
B   cat okl
C   cat oklp
D   frog    ok
E   cat ok
F   fox ok

还有一个file.txt,例如:

dog
cat 

这个想法是只保留在 file.txt 中存在模式的行。 在这里我应该得到:

query   subject col1
A   dog ok
B   cat okl
C   cat oklp
E   cat ok

我试过了:

file = open('file.txt').read()

df=[]
for row in tab['subject']:
 if row in file: 
   row.append(df)

但这似乎不是解决方案,谢谢您的帮助。

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    考虑到您的数据框称为 df,此答案将 file.txt 也作为数据框和 merge 两个数据框读取,从而产生所需的结果 - 类似于内部连接的解决方案来自 SQL:

    >> df2 = pd.read_csv('file.txt', header= None, names=['subject'])
    >> pd.merge(df, df2, on='subject')
    
        query   subject col1
    0   A       dog     ok
    1   B       cat     okl
    2   C       cat     oklp
    3   E       cat     ok
    

    【讨论】:

      【解决方案2】:

      您可以使用df.loc[] 获取满足条件的特定行,并使用isin() 检查数据框中的某些内容是否显示在给定列表中。首先列出文件中的条目:

      vals = []  # placeholder for our file contents
      with open('file.txt', 'r') as a_file:
          for line in a_file:
              vals.append(line)
      

      接下来选择主题列是从文件中读取的值之一的行。假设您的数据框称为df

      new_df = df.loc[df.subject.isin(vals)]
      

      旁注:您几乎从不想迭代数据框。这也有例外,但一般来说,如果您发现自己在数据帧上进行迭代(例如 for row in df:),您可以重写那段代码以利用 Pandas 中的矢量化函数,这些函数更多高效。

      【讨论】:

      • 我认为如果你删除 loc 你仍然应该没问题。 :)
      • 非常感谢正是我所需要的:)
      • @anky_91 你说得对,它应该仍然可以工作,但loc 是首选方法。出于某些原因,请参阅 stackoverflow.com/a/48411543/2464597stackoverflow.com/a/38886211/2464597。一般来说,我会说最好养成使用首选方法的习惯;在这种情况下loc.
      • @Engineero 很酷,感谢分享。如果您想减少操作,我的意思是这里没有必要。 :) 已经投票了
      猜你喜欢
      • 1970-01-01
      • 2022-12-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-15
      • 2017-12-15
      • 1970-01-01
      • 2019-10-16
      相关资源
      最近更新 更多