在python

时间:2017-09-28 07:45:38

标签: python pandas select dataframe

我需要在mac列中选择大于计数(即1)项的行。 然后创建一个具有时间戳最小值和最大值的DataFrame。

a=np.array([['A',1],['A',2],['A',3],['B',2],['C',1],['C',2]])
df=pd.DataFrame(a,columns=['mac','timestamp'])
df
Out[103]: 
  mac timestamp
0   A         1
1   A         2
2   A         3
3   B         2
4   C         1
5   C         2

count_macs= df.groupby(['mac'])['mac'].count()>1
count_macs
Out[105]: 
mac
A     True
B    False
C     True
Name: mac, dtype: bool

我想得到:

mac     ts1     ts2
A       1       3
C       1       2

但不知道如何正确应用.loc:

df.loc[count_macs]
IndexingError: Unalignable boolean Series key provided

2 个答案:

答案 0 :(得分:2)

我认为您需要max minsizecount(或NaN,如果不需要计算df = df.groupby('mac')['timestamp'].agg(['min','max', 'size']) d = {'min':'t1','max':'t2'} df = df[df['size'] > 1].drop('size', 1).rename(columns=d).reset_index() #alternatively: #df = df.query('size > 1').drop('size', 1).rename(columns=d).reset_index() print (df) mac t1 t2 0 A 1 3 1 C 1 2 )。然后按agg过滤,删除列,最后重命名列:

df = df[df['mac'].duplicated(keep=False)]
d = {'min':'t1','max':'t2'}
df = df.groupby('mac')['timestamp'].agg(['min','max']).rename(columns=d).reset_index()
print (df)
  mac t1 t2
0   A  1  3
1   C  1  2

另一个解决方案是首先使用boolean indexing过滤:

#include<bits/stdc++.h>
using namespace std;

int main() 
{
    int n,i;
    cin>>n;
    int factors=1,exponen=0;//exponent stores power of current prime
    while(n%2==0)//a separate check for 2       {
        exponen++;
        n=n/2;
    }
    factors= factors*(exponen+1);
    exponen=0;
    int original_n=n;
    for(i=3;n>1 && i<=sqrt(original_n);i+=2)//Checking for every prime number
    {
        exponen=0;
        while(n%i==0)
        {
            exponen++;
            n=n/i;
        }
        factors= factors*(exponen+1);
    }
    cout<< factors<< endl;
    return 0;
}

答案 1 :(得分:2)

lambda

f = lambda g: g.timestamp.agg(['min', 'max'])[g.size() > 1]
h = lambda x, c=iter(['ts1', 'ts2']): next(c)
f(df.groupby('mac')).rename(columns=h).reset_index()

  mac ts1 ts2
0   A   1   3
1   C   1   2

为了清楚起见:我们可以放弃h而只是做

f = lambda g: g.timestamp.agg(['min', 'max'])[g.size() > 1]
f(df.groupby('mac')).rename(columns=dict(min='ts1', max='ts2')).reset_index()

  mac ts1 ts2
0   A   1   3
1   C   1   2

但我喜欢使用h( - :