我将给出一个简单的数据框作为示例:
身份证号码 | 年份 | 公司 | 产品 |
---|---|---|---|
1 | 1984 | ACME | P1 |
2 | 1986 | ACME | P2 |
7 | 1959 | ACME | P7 |
3 | 1951 | 史密斯 | P3 |
4 | 1982 | 科尔曼 | P4 |
5 | 1987 | 山 | P5 |
6 | 1960 | 坦纳 | P6 |
如果我想统计 1980 年或以后的所有产品年份,将那些仅在 1980 年之前有条目的公司报告为 0,我该怎么做?
如果我过滤 YEAR >= 1980 然后尝试从中获取计数,那么我可能会得到 ACME:2、COLEMAN:1、HILL:1。
我想要的是 ACME:2、COLEMAN:1、HILL:1、SMITH:0、TANNER:0。我不想算 1980 年之前的 ACME 行
groupby.sum
:
df['Year'].gt(1980).groupby(df['Company']).sum()
输出:
Company
ACME 2
COLEMAN 1
HILL 1
SMITH 0
TANNER 0
Name: Year, dtype: int64
进行分组和求和:
import io
import pandas as pd
with io.StringIO('''ID Year Company Product
1 1984 ACME P1
2 1986 ACME P2
7 1959 ACME P7
3 1951 SMITH P3
4 1982 COLEMAN P4
5 1987 HILL P5
6 1960 TANNER P6
''') as f:
df = pd.read_csv(
f,
delim_whitespace=True,
).set_index(['Company', 'ID'])
counts = (
df['Year'] >= 1980
).groupby('Company').sum()
print(counts)