Python Pandas SUMIF excel 等效
Python Pandas SUMIF excel equivalent
我不知道如何在我的 python 脚本中完成特定任务。
我有一个数据框,其中包含特定主题的媒体报道。我的专栏之一是特定文章的作者,例如...
我正在尝试创建一个数据透视表 table 来显示列中每个记者的总数,就像这样
datajournalist = company1_topline.pivot_table(index='AuthorUsername', values='ContentID', aggfunc= np.count_nonzero )
这会给我类似的东西
AuthorUsername count_nonzero
Aaron Mehta 1
Aamer Madhani 1
Aamer Madhani ; Ben Fox 1
我正在寻找的是一种让主元 table 也计算出现在多个值单元格中的姓名的方法,以获得每个作者的真实计数。因此,例如,具有“Aamer Madhani ; Ben Fox”的行也将计入“Aamer Madhani”的计数,因此仅“Aamer Madhani”的行将计数为 2 而不是 1 等......是有办法做到这一点?在 excel 中,这可以通过 SUMIF 实现,但我不知道如何使用 Python/Pandas。
期望的输出
AuthorUsername count_nonzero
Aaron Mehta 1
Aamer Madhani 2
Aamer Madhani ; Ben Fox 1
如果有人能指出我正确的方向,将不胜感激。
你的 DataFrame 有这样的 AuthorUsername
列:
AuthorUsername
0 Aaron Mehta
1 Aamer Madhani
2 Aamer Madhani ; Ben Fox
你可以做到:
import collections
# Remove leading and trailing spaces (if any).
df['AuthorUsername'] = df['AuthorUsername'].str.strip()
# Get unique authors and their counts.
authors_counts = collections.Counter(df['AuthorUsername'].str.split('\s*;\s*').sum())
# Add to new column.
real_counts = collections.defaultdict(lambda: 1, authors_counts)
df['count_nonzero'] = [real_counts[a] for a in df['AuthorUsername']]
print(df)
结果:
AuthorUsername count_nonzero
0 Aaron Mehta 1
1 Aamer Madhani 2
2 Aamer Madhani ; Ben Fox 1
评论后编辑 - 汇总更多指标:
在评论之后,这是一个更通用的版本,它还可以对 Metrics
列和可能的其他列进行求和。
输入数据帧:
AuthorUsername Metrics
0 Aaron Mehta 1.3
1 Aamer Madhani 2.0
2 Aamer Madhani ; Ben Fox 0.5
代码:
df['AuthorUsername'] = df['AuthorUsername'].str.strip()
df['single_authors'] = df['AuthorUsername'].str.split('\s*;\s*')
df['count_nonzero'] = 1
single_metrics = df.explode('single_authors').groupby('single_authors').sum()
multiple_metrics = df[df['single_authors'].map(len) > 1].groupby('AuthorUsername').sum()
all_metrics = pd.concat([single_metrics, multiple_metrics]).rename_axis('AuthorUsername').reset_index()
df = df.drop(columns=['Metrics', 'count_nonzero', 'single_authors']).merge(all_metrics, how='left', on='AuthorUsername')
print(df)
结果:
AuthorUsername Metrics count_nonzero
0 Aaron Mehta 1.3 1
1 Aamer Madhani 2.5 2
2 Aamer Madhani ; Ben Fox 0.5 1
我不知道如何在我的 python 脚本中完成特定任务。
我有一个数据框,其中包含特定主题的媒体报道。我的专栏之一是特定文章的作者,例如...
我正在尝试创建一个数据透视表 table 来显示列中每个记者的总数,就像这样
datajournalist = company1_topline.pivot_table(index='AuthorUsername', values='ContentID', aggfunc= np.count_nonzero )
这会给我类似的东西
AuthorUsername count_nonzero
Aaron Mehta 1
Aamer Madhani 1
Aamer Madhani ; Ben Fox 1
我正在寻找的是一种让主元 table 也计算出现在多个值单元格中的姓名的方法,以获得每个作者的真实计数。因此,例如,具有“Aamer Madhani ; Ben Fox”的行也将计入“Aamer Madhani”的计数,因此仅“Aamer Madhani”的行将计数为 2 而不是 1 等......是有办法做到这一点?在 excel 中,这可以通过 SUMIF 实现,但我不知道如何使用 Python/Pandas。
期望的输出
AuthorUsername count_nonzero
Aaron Mehta 1
Aamer Madhani 2
Aamer Madhani ; Ben Fox 1
如果有人能指出我正确的方向,将不胜感激。
你的 DataFrame 有这样的 AuthorUsername
列:
AuthorUsername
0 Aaron Mehta
1 Aamer Madhani
2 Aamer Madhani ; Ben Fox
你可以做到:
import collections
# Remove leading and trailing spaces (if any).
df['AuthorUsername'] = df['AuthorUsername'].str.strip()
# Get unique authors and their counts.
authors_counts = collections.Counter(df['AuthorUsername'].str.split('\s*;\s*').sum())
# Add to new column.
real_counts = collections.defaultdict(lambda: 1, authors_counts)
df['count_nonzero'] = [real_counts[a] for a in df['AuthorUsername']]
print(df)
结果:
AuthorUsername count_nonzero
0 Aaron Mehta 1
1 Aamer Madhani 2
2 Aamer Madhani ; Ben Fox 1
评论后编辑 - 汇总更多指标:
在评论之后,这是一个更通用的版本,它还可以对 Metrics
列和可能的其他列进行求和。
输入数据帧:
AuthorUsername Metrics
0 Aaron Mehta 1.3
1 Aamer Madhani 2.0
2 Aamer Madhani ; Ben Fox 0.5
代码:
df['AuthorUsername'] = df['AuthorUsername'].str.strip()
df['single_authors'] = df['AuthorUsername'].str.split('\s*;\s*')
df['count_nonzero'] = 1
single_metrics = df.explode('single_authors').groupby('single_authors').sum()
multiple_metrics = df[df['single_authors'].map(len) > 1].groupby('AuthorUsername').sum()
all_metrics = pd.concat([single_metrics, multiple_metrics]).rename_axis('AuthorUsername').reset_index()
df = df.drop(columns=['Metrics', 'count_nonzero', 'single_authors']).merge(all_metrics, how='left', on='AuthorUsername')
print(df)
结果:
AuthorUsername Metrics count_nonzero
0 Aaron Mehta 1.3 1
1 Aamer Madhani 2.5 2
2 Aamer Madhani ; Ben Fox 0.5 1