我需要在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
答案 0 :(得分:2)
我认为您需要max
min
,size
和count
(或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
( - :