Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 根据计数和来自另一数据帧的条件创建新列 问题_Python_Python 3.x_Pandas_Dataframe_Group By - Fatal编程技术网

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")