Python 按列按组统计不同的连续行
我试图对每个客户的不同连续行数求和 所以我的数据看起来像这个虚拟的:Python 按列按组统计不同的连续行,python,python-3.x,pandas,Python,Python 3.x,Pandas,我试图对每个客户的不同连续行数求和 所以我的数据看起来像这个虚拟的: df = pd.DataFrame({'Customer':['A','A','A','A','A','A','A','A', 'B','B','B','B','B','B','B','B'], 'Time':['00:00','01:00','02:00','03:00','04:00', '05:00','06:00','07:00','00:00','01:00','02:00','
df = pd.DataFrame({'Customer':['A','A','A','A','A','A','A','A', 'B','B','B','B','B','B','B','B'],
'Time':['00:00','01:00','02:00','03:00','04:00', '05:00','06:00','07:00','00:00','01:00','02:00','03:00','04:00','05:00','06:00','07:00'],
'Lat':[20,20,30,30,30,40,20,20,20,20,30,30,30, 40,20,20],
'Lon':[40,40,50,50,50,60,40,40,40,40,50,50,50,60,40,40]})
Customer Time Lat Lon
0 A 00:00 20 40
1 A 01:00 20 40
2 A 02:00 30 50
3 A 03:00 30 50
4 A 04:00 30 50
5 A 05:00 40 60
6 A 06:00 20 40
7 A 07:00 20 40
8 B 00:00 20 40
9 B 01:00 20 40
10 B 02:00 30 50
11 B 03:00 30 50
12 B 04:00 30 50
13 B 05:00 40 60
14 B 06:00 20 40
15 B 07:00 20 40
我想按客户统计不连续的不同行数(根据Lat和Lon)。因此,在本例中,即使只有3对不同的Lat和Lon,两个客户都将返回4
这:
只处理一列,不按客户分组
但我似乎做不到
df[['Lat','Lon']] != df[['Lat','Lon']]
它给出:
ValueError: Wrong number of items passed 2, placement implies 1
或按客户分组。有人能帮忙吗
df.groupby('Customer')[['Lat', 'Lon']].apply(lambda s: s.diff().ne(0).all(1).sum())
Customer
A 4
B 4
dtype: int64
IIUC
我正在使用
shift
创建一个新键,然后使用删除重复项
df['key']=df.groupby('Customer').apply(lambda x : x[['Lat','Lon']].ne(x[['Lat','Lon']].shift()).all(1).cumsum()).reset_index(level=0,drop=True)
df.drop_duplicates(['Customer','key'])
Customer Time Lat Lon key
0 A 00:00 20 40 1
2 A 02:00 30 50 2
5 A 05:00 40 60 3
6 A 06:00 20 40 4
8 B 00:00 20 40 1
10 B 02:00 30 50 2
13 B 05:00 40 60 3
14 B 06:00 20 40 4
我正在使用
shift
创建一个新键,然后使用删除重复项
df['key']=df.groupby('Customer').apply(lambda x : x[['Lat','Lon']].ne(x[['Lat','Lon']].shift()).all(1).cumsum()).reset_index(level=0,drop=True)
df.drop_duplicates(['Customer','key'])
Customer Time Lat Lon key
0 A 00:00 20 40 1
2 A 02:00 30 50 2
5 A 05:00 40 60 3
6 A 06:00 20 40 4
8 B 00:00 20 40 1
10 B 02:00 30 50 2
13 B 05:00 40 60 3
14 B 06:00 20 40 4
@adhg
all
表示与它相等的所有行@WeNYoBen@adhgall
表示所有等于Truegot it@WeNYoBen的行