pandas - 在按 DataFrame 分组后仅保留 True 值
pandas - keep only True values after groupby a DataFrame
我一直在使用 User_IDs、DateTime 对象和其他信息处理 DataFrame,例如以下摘录:
User_ID;Latitude;Longitude;Datetime
222583401;41.4020375;2.1478710;2014-07-06 20:49:20
287280509;41.3671346;2.0793115;2013-01-30 09:25:47
329757763;41.5453577;2.1175164;2012-09-25 08:40:59
189757330;41.5844998;2.5621569;2013-10-01 11:55:20
624921653;41.5931846;2.3030671;2013-07-09 20:12:20
414673119;41.5550136;2.0965829;2014-02-24 20:15:30
414673119;41.5550136;2.0975829;2014-02-24 20:16:30
414673119;41.5550136;2.0985829;2014-02-24 20:17:30
我将用户分组为:
g = df.groupby(['User_ID','Datetime'])
然后检查是否没有单个 DataTime 对象:
df = df.groupby('User_ID')['Datetime'].apply(lambda g: len(g)>1)
我获得了以下布尔数据帧:
User_ID
189757330 False
222583401 False
287280509 False
329757763 False
414673119 True
624921653 False
Name: Datetime, dtype: bool
这对我来说很好,只保留 User_ID 具有 True 掩码值。现在我只想保留与 True 值关联的 User_ID 值,并将它们写入一个新的 DataFrame,例如 pandas.to_csv
。预期的 DataFrame 将仅包含 User_ID 和多个 DateTime 对象:
User_ID;Latitude;Longitude;Datetime
414673119;41.5550136;2.0965829;2014-02-24 20:15:30
414673119;41.5550136;2.0975829;2014-02-24 20:16:30
414673119;41.5550136;2.0985829;2014-02-24 20:17:30
如何访问每个 User_ID 的布尔值?感谢您的帮助。
将 df.groupby('User_ID')['Datetime'].apply(lambda g: len(g)>1)
的结果分配给一个变量,这样你就可以执行布尔索引,然后使用这个索引来调用 isin
并过滤你的 orig df:
In [366]:
users = df.groupby('User_ID')['Datetime'].apply(lambda g: len(g)>1)
users
Out[366]:
User_ID
189757330 False
222583401 False
287280509 False
329757763 False
414673119 True
624921653 False
Name: Datetime, dtype: bool
In [367]:
users[users]
Out[367]:
User_ID
414673119 True
Name: Datetime, dtype: bool
In [368]:
users[users].index
Out[368]:
Int64Index([414673119], dtype='int64')
In [361]:
df[df['User_ID'].isin(users[users].index)]
Out[361]:
User_ID Latitude Longitude Datetime
5 414673119 41.555014 2.096583 2014-02-24 20:15:30
6 414673119 41.555014 2.097583 2014-02-24 20:16:30
7 414673119 41.555014 2.098583 2014-02-24 20:17:30
然后您可以正常调用上面的 to_csv
首先,确保您没有重复的条目:
df = df.drop_duplicates()
然后,算出每个的计数:
counts = df.groupby('User_ID').Datetime.count()
最后,找出索引重叠的地方:
df[df.User_ID.isin(counts[counts > 1].index)]
我一直在使用 User_IDs、DateTime 对象和其他信息处理 DataFrame,例如以下摘录:
User_ID;Latitude;Longitude;Datetime
222583401;41.4020375;2.1478710;2014-07-06 20:49:20
287280509;41.3671346;2.0793115;2013-01-30 09:25:47
329757763;41.5453577;2.1175164;2012-09-25 08:40:59
189757330;41.5844998;2.5621569;2013-10-01 11:55:20
624921653;41.5931846;2.3030671;2013-07-09 20:12:20
414673119;41.5550136;2.0965829;2014-02-24 20:15:30
414673119;41.5550136;2.0975829;2014-02-24 20:16:30
414673119;41.5550136;2.0985829;2014-02-24 20:17:30
我将用户分组为:
g = df.groupby(['User_ID','Datetime'])
然后检查是否没有单个 DataTime 对象:
df = df.groupby('User_ID')['Datetime'].apply(lambda g: len(g)>1)
我获得了以下布尔数据帧:
User_ID
189757330 False
222583401 False
287280509 False
329757763 False
414673119 True
624921653 False
Name: Datetime, dtype: bool
这对我来说很好,只保留 User_ID 具有 True 掩码值。现在我只想保留与 True 值关联的 User_ID 值,并将它们写入一个新的 DataFrame,例如 pandas.to_csv
。预期的 DataFrame 将仅包含 User_ID 和多个 DateTime 对象:
User_ID;Latitude;Longitude;Datetime
414673119;41.5550136;2.0965829;2014-02-24 20:15:30
414673119;41.5550136;2.0975829;2014-02-24 20:16:30
414673119;41.5550136;2.0985829;2014-02-24 20:17:30
如何访问每个 User_ID 的布尔值?感谢您的帮助。
将 df.groupby('User_ID')['Datetime'].apply(lambda g: len(g)>1)
的结果分配给一个变量,这样你就可以执行布尔索引,然后使用这个索引来调用 isin
并过滤你的 orig df:
In [366]:
users = df.groupby('User_ID')['Datetime'].apply(lambda g: len(g)>1)
users
Out[366]:
User_ID
189757330 False
222583401 False
287280509 False
329757763 False
414673119 True
624921653 False
Name: Datetime, dtype: bool
In [367]:
users[users]
Out[367]:
User_ID
414673119 True
Name: Datetime, dtype: bool
In [368]:
users[users].index
Out[368]:
Int64Index([414673119], dtype='int64')
In [361]:
df[df['User_ID'].isin(users[users].index)]
Out[361]:
User_ID Latitude Longitude Datetime
5 414673119 41.555014 2.096583 2014-02-24 20:15:30
6 414673119 41.555014 2.097583 2014-02-24 20:16:30
7 414673119 41.555014 2.098583 2014-02-24 20:17:30
然后您可以正常调用上面的 to_csv
首先,确保您没有重复的条目:
df = df.drop_duplicates()
然后,算出每个的计数:
counts = df.groupby('User_ID').Datetime.count()
最后,找出索引重叠的地方:
df[df.User_ID.isin(counts[counts > 1].index)]