问题2:请容忍我,因为我正在学习和尝试理解熊猫的实现
假设我的数据框如下所示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列中包含字符串文章和sr.confirm的行。
根据我们现在得到的解决方案,我希望根据日期进行进一步的筛选,只返回在同一日期或之前1天查看的带有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 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`
Question1假设我有一个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')发布于 2019-11-27 19:51:21
您可以将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发布于 2019-11-27 19:44:05
这是一种将布尔逻辑掩码与groupby和transform结合使用的方法,其中|是逻辑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.0https://stackoverflow.com/questions/59069174
复制相似问题