Python 根据计数和来自另一数据帧的条件创建新列 问题
我有一个数据帧Python 根据计数和来自另一数据帧的条件创建新列 问题,python,python-3.x,pandas,dataframe,group-by,Python,Python 3.x,Pandas,Dataframe,Group By,我有一个数据帧df,产品如下: ID DATE TYPE Client_ID 1 2015-01-15 A johndoe 2 2009-01-15 C johndoe 3 2015-03-12 C johndoe 4 2010-01-01 B johndoe 5 2017-01-01 B johndoe 6 2018-01-01 A markdoe 7 2019
df
,产品如下:
ID DATE TYPE Client_ID
1 2015-01-15 A johndoe
2 2009-01-15 C johndoe
3 2015-03-12 C johndoe
4 2010-01-01 B johndoe
5 2017-01-01 B johndoe
6 2018-01-01 A markdoe
7 2019-01-01 C johndoe
8 2012-01-01 C markdoe
在此基础上,我创建了一个仅包含a型产品的数据框,df-a
:
ID DATE TYPE Client_ID
1 2015-01-15 A johndoe
6 2018-01-01 A markdoe
我想要创建的是df-A
2个变量,用于计算客户拥有的日期低于或等于所分析A产品的B型和C型产品的数量。
我想要的结果是:
ID DATE TYPE Client_ID NB-B NB-C
1 2015-01-15 A johndoe 1 1
6 2018-01-01 A markdoe 0 1
第一行的
NB-B
是1,因为johndoe
有两个B-products,但只有一个有Date让我们试试pivot\u表并加入:
# extract the A types
aType = df.TYPE.eq('A')
s = df[aType].set_index('Client_ID')
(df[~aType].assign(valid=lambda x: x['DATE'].le(x['Client_ID'].map(s['DATE'])).astype(int))
.pivot_table(index='Client_ID',columns='TYPE',
values='valid', aggfunc='max',
fill_value=0)
.add_prefix('NB_')
.join(s)
.reset_index()
)
输出:
Client_ID NB_B NB_C ID DATE TYPE
0 johndoe 1 1 1 2015-01-15 A
1 markdoe 0 1 6 2018-01-01 A
你可以尝试使用
Pandas.Series.str.count("string")
提取要作为序列号计数的列,然后应用serie.str.count(“要查找的字符串”)
您可以使用循环获取“Client_ID”系列中的所有名称
这将计算“客户ID”列中出现的所有“johndoe”非常感谢您的回答!然而,我仍然面临一个问题。我编辑了我的原始帖子,以显示更多细节并解释我无法解决的问题。这与我已经尝试过的解决方案类似。这可能会起作用,但要在每个df-A
行上循环,并且每次从df
中分离出一个子数据帧,然后进行计数,这就太长了
ID DATE TYPE Client_ID NB-A NB-B NB-C
1 2015-01-15 A johndoe 1 1 1
6 2018-01-01 A johndoe 2 2 3
# extract the A types
aType = df.TYPE.eq('A')
s = df[aType].set_index('Client_ID')
(df[~aType].assign(valid=lambda x: x['DATE'].le(x['Client_ID'].map(s['DATE'])).astype(int))
.pivot_table(index='Client_ID',columns='TYPE',
values='valid', aggfunc='max',
fill_value=0)
.add_prefix('NB_')
.join(s)
.reset_index()
)
Client_ID NB_B NB_C ID DATE TYPE
0 johndoe 1 1 1 2015-01-15 A
1 markdoe 0 1 6 2018-01-01 A
Pandas.Series.str.count("string")
series = df["Client_ID"]
count = series.str.count("johndoe")