【问题标题】:How do we loop through the data frame based on column and retrieve the rows based on conditions我们如何根据列循环遍历数据框并根据条件检索行
【发布时间】:2019-11-27 11:27:06
【问题描述】:

问题 2:请多多包涵,因为我正在学习并尝试通过实现来理解 Pandas

假设我的数据框如下 Date A B-Id C D E November 05, 2019 1 aa article-12 23 34 November 07, 2019 1 aa article-21 23 34 November 09, 2019 1 aa sr.confirm 23 34 November 14, 2019 1 bb article-30 23 34 December 14, 2019 1 bb article-76 23 34 December 14, 2019 1 bb article-04 23 34 December 15, 2019 1 bb article-11 23 34 December 15, 2019 1 bb sr.confirm 23 34 December 15, 2019 1 cc article-54 23 34 December 16, 2019 1 cc article-12 23 34 December 17, 2019 1 cc article-12 23 34

根据@Osbark,您提供的解决方案将为每个唯一的visitor_id 即B-Id 过滤掉C 列中包含字符串article 和sr.confirm 的行。

根据我们得到的解决方案 Date A B-Id C D E November 05, 2019 1 aa article-12 23 34 November 07, 2019 1 aa article-21 23 34 November 09, 2019 1 aa sr.confirm 23 34 November 14, 2019 1 bb article-30 23 34 December 14, 2019 1 bb article-76 23 34 December 14, 2019 1 bb article-04 23 34 December 15, 2019 1 bb article-11 23 34 December 15, 2019 1 bb sr.confirm 23 34 现在我想根据日期进一步过滤,只返回带有 sr.confirm 的行和在同一日期或前 1 个日期查看的文章 所以我得到 ` 日期 A B-Id C D E 2019 年 12 月 14 日 1 bb 文章-76 23 34 2019 年 12 月 14 日 1 bb 文章-04 23 34 2019 年 12 月 15 日 1 bb 文章-11 23 34

2019 年 12 月 15 日 1 bb sr.confirm 23 34`

问题1 假设我有一个 csv 文件,如下所示:

A   B   C            D   E
1   aa  articlle-12  23  34
2   aa  web service  22  35
3   aa               25  41
4   bb  article-23   12  21
5   bb  sr.confirm   34  23
6   bb  mobile       56  98
7   cc  sr.confirm   76  65
8   cc  new          97  51

在上面的csv文件中,B-是唯一的visitor_id。

我想要做的是获取每个visitor_id,即B,例如:第一个visitor_id aa 有两行,然后检查条件是否c 具有包含文章字符串的行和另一个包含sr.confirm 字符串的rw=ow。

我的最终输出 csv 文件应该是这样的:

A   B   C            D   E
4   bb  article-23   12  21
5   bb  sr.confirm   34  23

我试过用 pandas 来做同样的事情,下面是代码

import pandas as pd
# df = pd.read_csv('/Users/macbookpro/Downloads/kb1.csv', index_col= "Page Name (custom) (evar31)" )
df1 = pd.read_csv('/Users/macbookpro/Downloads/KB123.csv')# print(df1)

df2 = df1[df1['Page Name (custom) (evar31)'].str.contains("my : group : get-support : file_SR : confirmation", na=False)]# print(df2)
# print(df2.keys())

df3 = df1[df1['Page Name (custom) (evar31)'].str.contains("kb : s : article : ", na=False)]# print(df3)
# print(df3.keys())
df4 = pd.merge(df3, df2, how='inner', on='Visitor_ID')
df4.drop_duplicates(subset="Visitor_ID", keep=False, inplace=False)
def drop_y(df): 
# list comprehension of the cols that end with '_y' 
to_drop = [x for x in df if x.endswith('_y')] 
df.drop(to_drop, axis=1, inplace=True)
drop_y(df4)

def rename_x(df):
for col in df:
if col.endswith('_x'):
df.rename(columns={col: col.rstrip('_x')}, inplace=True)

rename_x(df4)

df5 = df4.drop_duplicates(subset='Page Name (custom) (evar31)',keep='first', inplace=False)
df6 = pd.concat([df5, df2])df6.sort_values('Visitor_ID', axis=0, ascending=True,inplace=False, kind='quicksort', na_position='last')
print(df6['Page Name (custom) (evar31)'])
df6.to_csv(r'/Users/macbookpro/Desktop/new.csv')

【问题讨论】:

    标签: python pandas csv dataframe


    【解决方案1】:

    您可以将groupby 与自定义函数一起使用,过滤掉既没有article 也没有sr.confirm 的访问者,并且只保留这些行:

    def contains_string(group):
        mask_article = group["C"].str.contains("article")
        mask_confirm = group["C"].str.contains("sr.confirm")
        if mask_article.any() & mask_confirm.any():
            return group[mask_article | mask_confirm]
        else:
            return pd.DataFrame([])
    
    result = df.groupby("B", as_index=False).apply(contains_string)
    print(result)
    
         A   B           C     D     E
    3  4.0  bb  article-23  12.0  21.0
    4  5.0  bb  sr.confirm  34.0  23.0
    

    【讨论】:

    • 是的,上面的方法有效,现在我在最初问题的顶部添加了一个额外的查询,如果你能帮助我如何实现这一点,那就太好了
    • 你能帮我解决上面有额外要求的查询吗
    • 如有其他疑问,请提出新问题
    【解决方案2】:

    这是一种使用带有groupbytransform 的布尔逻辑掩码的方法,其中| 是逻辑OR& 是逻辑AND

    mask1 = df['C'].eq('sr.confirm')
    mask2 = df['C'].str.contains('article')
    mask3 = mask1.groupby(df['B']).transform('any') & mask2.groupby(df['B']).transform('any')
    
    df[(mask1 | mask2) & mask3]
    

    [出]

       A   B           C   D     E
    3  4  bb  article-23  12  21.0
    4  5  bb  sr.confirm  34  23.0
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-10-03
      • 1970-01-01
      • 2016-07-02
      • 2020-10-24
      • 2021-01-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多