我是熊猫新手,希望有人至少可以指出我正确的方向。
实际问题出现了:
df:
time Area lon lat mode ID
1993-08-01 00:34:28 A 45.627800 34.733400 false 3183
1993-08-01 00:34:28 A 45.699600 34.639300 false 3183
1993-08-01 00:34:28 A 45.603800 34.730600 false 3183
1992-03-21 01:13:18 A 45.686400 34.548100 false 3184
1992-03-21 01:13:18 A 45.702400 34.554300 false 3184
1992-03-21 01:13:18 B 45.304784 34.626540 NaN 3184
1992-03-21 16:13:20 A 45.633800 34.709700 false 3185
1992-03-21 16:13:20 A 45.643400 34.709000 true 3185
1992-03-21 16:13:20 A 45.634600 34.959500 true 3185
我想过滤掉'ID'的所有实例,这些实例只有来自一个'Area'的数据( A或B ) 。因此,我想要的'ID'必须至少有一个'A' AND 'B'的实例存储在新的数据框中。
从上面提到的df中,只有下面提到的eninres符合约束条件:
1992-03-21 01:13:18 A 45.686400 34.548100 false 3184
1992-03-21 01:13:18 A 45.702400 34.554300 false 3184
1992-03-21 01:13:18 B 45.304784 34.626540 NaN 3184
现在我要尝试使用if语句和一个列表临时存储每个'ID'的'Area'属性。这感觉就像一个非常糟糕的方法,必须有一些惯用的熊猫这样做。
答案 0 :(得分:0)
我认为您需要使用pivot_table
dropna
来删除所有不属于所有组的值:
print (df.pivot_table(index='Area', columns='ID', values='lat').dropna(axis=1))
ID 3184
Area
A 34.55120
B 34.62654
vals = df.pivot_table(index='Area', columns='ID', values='lat').dropna(axis=1).columns
print (vals)
Int64Index([3184], dtype='int64', name='ID')
上次使用boolean indexing
与isin
:
print (df[df.ID.isin(vals)])
time Area lon lat mode ID
3 1992-03-21 01:13:18 A 45.686400 34.54810 False 3184
4 1992-03-21 01:13:18 A 45.702400 34.55430 False 3184
5 1992-03-21 01:13:18 B 45.304784 34.62654 NaN 3184
答案 1 :(得分:0)
您可以查看以下内容:
In [24]: df
Out[24]:
area id
0 A 3183
1 A 3183
2 A 3184
3 B 3184
4 A 3185
5 A 3185
In [25]: df[df.groupby('id')['area'].transform('nunique') > 1]
Out[25]:
area id
2 A 3184
3 B 3184
我将我的示例缩减为仅有的两个相关列(ID和区域),但这对您的完整数据框没有问题。
我基本上计算每个ID的不同区域的数量,并过滤掉只有一个区域的区域。