如何根据另一列找到行的值?

时间:2018-04-12 04:05:02

标签: python pandas dataframe

我有这样的数据集:

user-id     time    location   msg  path
  1           1         1       1    0
  2           1         1       2    1000
  3           1         2       3    1
  4           1         2       0    0
  5           1         3       0    0
  1           2         2       2    0
  2           2         1       1    1
  3           2         1       1    1
  4           2         0       0    0
  5           2         0       0    0
  1           3         1       3    0
  2           3         3       1    0

我想根据最大msg数找到路径,其中两个记录的时间和位置相同。

time_locs = pd.unique(df['time_loc'])
for time_loc in time_locs:
   dc_group = df[df['time_loc'] == time_loc]
   if(len(dc_group) > 1):
        max_num_msg = max(dc_group['msgs'])

所以我将时间和位置压缩为time_loc并找到最大ms数。现在我怎样才能找到该行的路径?

例如,在这种情况下,我的第一个dc-group是这两行:

user-id     time    location   msg  path
  1           1         1       1    0
  2           1         1       2    1000

我想找到1000。

我尝试了这段代码,但它没有用。

user_group = df.loc[max(dc_group['msgs']), 'path']

因为它正在搜索所有df。并且.loc不适用于dc_group,这意味着此代码面错误:

user_group = dc_group.loc[max(dc_group['msgs']), 'path']

1 个答案:

答案 0 :(得分:1)

你肯定想在这里使用非循环方法。您可以使用.argmax来获取最大值的索引而不是值本身。类似的东西:

In [15]: df
Out[15]:
    user-id  time  location  msg  path
0         1     1         1    1     0
1         2     1         1    1     0
2         3     1         2    0     0
3         4     1         2    0     0
4         5     1         3    0     0
5         1     2         2    2     0
6         2     2         1    1     0
7         3     2         1    1     0
8         4     2         0    0     0
9         5     2         0    0     0
10        1     3         1    3     0
11        2     3         3    1     0

In [16]: df.loc[df.time == df.location, 'msg'].argmax()
Out[16]: 5

In [17]: max_idx = df.loc[df.time == df.location, 'msg'].argmax()

In [18]: df.loc[max_idx]
Out[18]:
user-id     1
time        2
location    2
msg         2
path        0
Name: 5, dtype: int64

In [19]: df.loc[max_idx, 'path']
Out[19]: 0

如果你想要所有的行,那么只需使用布尔索引:

In [25]: df.loc[df.time == df.location]
Out[25]:
    user-id  time  location  msg  path
0         1     1         1    1     0
1         2     1         1    1     0
5         1     2         2    2     0
11        2     3         3    1     0

如果您愿意,可以.query

In [26]: df.query('time == location')
Out[26]:
    user-id  time  location  msg  path
0         1     1         1    1     0
1         2     1         1    1     0
5         1     2         2    2     0
11        2     3         3    1     0