这是我的数据框:
import pandas as pd
df = pd.DataFrame({'A': ['one', 'one', 'two', 'two', 'one'],
'B': ['Ar', 'Br', 'Cr', 'Ar', 'Ar'],
'C': ['12/15/2011', '11/11/2001', '08/30/2015', '07/3/1999', '03/03/2000'],
'D': [1, 7, 3, 4, 5],
'F': ['12/1/2011','10/1/2000','8/15/2015','12/1/2011','12/1/2011'] })
df['C'] = pd.to_datetime(df['C'])
df['F'] = pd.to_datetime(df['F'])
我希望按列B
进行分组,然后针对每个组检查列C
是否包含列F
后30天内的日期。我会找回整个组的指标列,它应该看起来像
df['indicator'] = [1,0,1,1,1]
这是我试过的:
def date_test(x, y):
result = False
for i in x.index:
if x[i]<y[i]+ pd.Timedelta(days=30):
result = True
return result
df['indicator'] = df.groupby('B')['C','F'].transform(date_test).astype('int64')
但我回来了TypeError: Transform function invalid for data types
所以我想我不能通过两列来转换函数。有什么想法吗?
答案 0 :(得分:2)
我认为你是对的,.transform()的工作方式是传递的函数分别评估每一列(在本例中为C和F)。有关详细信息,请参阅here。
但是,我认为你可以使用.apply()并获得你想要的结果:
>>> dfGroup = df.groupby('B')
>>> dfGroup.apply(lambda x: x['C'] < x['F'] + pd.Timedelta(days=30))
>>> B
Ar 0 True
3 True
4 True
Br 1 False
Cr 2 True
dtype: bool
答案 1 :(得分:1)
我不知道它是否会对你有所帮助,但是:
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<archive>
<manifest>
<mainClass>com.app.appmain</mainClass>
</manifest>
</archive>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</configuration>
</plugin>
<dependencies>
<dependency>
<groupId>commons-cli</groupId>
<artifactId>commons-cli</artifactId>
<version>1.3</version>
</dependency>
</dependencies>
然后在for循环中运行它以读取df = {'1': 'one', '3': 'three', '2': 'two', '5': 'five', '4': 'four', 'indicator':[]}
if 'one' in df.values() == True:
df['indicator'].append(1)
else:
df['indicator'].append(0)