我有一个熊猫数据框,它是根据某些条件融化和过滤后得到的,看起来像这样
UsernameNotFoundException
从这个数据框中,我想制作一些这样的数据框,
BadCredentialsException
从数据中的列 P D
A 2018-01-01
A 2018-01-02
A 2018-01-03
B 2018-01-03
A 2018-01-04
B 2018-01-04
A 2018-01-05
A 2018-01-06
A 2018-01-07
B 2018-01-07
中我们可以看到,从P D1 D2
A 2018-01-01 2018-01-02
A, B 2018-01-03 2018-01-04
A 2018-01-05 2018-01-06
A, B 2018-01-07 -
到P
只有一个值A
,因此我们将在结果数据帧为2018-01-01
类似地,从2018-01-02
到A, 2018-01-01, 2018-01-02
之间有A和B,因此数据帧中的第二行。
如何在熊猫中高效执行此操作??
答案 0 :(得分:3)
您可以尝试以下操作:
img{
-webkit-touch-callout: none !important;
-webkit-user-select: none !important; }
.className{-webkit-touch-callout: none !important;
-webkit-user-select: none !important; }
输出:
当然,如果您有奇数个日期(如您的示例中所示),则不会捕获最后一个日期,但是可以根据需要将其附加在末尾。
答案 1 :(得分:0)
我提出了一个临时解决方案,我知道这根本不是最佳方案。希望有人可以提出一些改进和增强的建议。
a_df = pd.read_clipboard()
s = a_df.groupby(by=['D'])['P'].unique().apply('+'.join).reset_index()
s['s_1'] = s.P.eq(s.P.shift(-1))
s['s_2'] = s.P.eq(s.P.shift(1))
a1 = s.loc[(s['s_1'] == True) & (s['s_2'] == False)].index.values
a2 = s.loc[(s['s_1'] == False) & (s['s_2'] == True)].index.values
count = 1
s['Flag'] = 0
for x,y in zip(a1, a2):
s.loc[x:y, 'Flag'] = count
count += 1
s.groupby(['Flag'], as_index=False).agg({'P' : 'first', 'D' : ['min', 'max']}).sort_values([('D', 'min')])
Flag P D
first min max
1 1 A 2018-01-01 2018-01-02
2 2 A+B 2018-01-03 2018-01-04
3 3 A 2018-01-05 2018-01-06
0 0 A+B 2018-01-07 2018-01-07