在Pandas中带有日期列的列中查找更改

时间:2019-07-03 06:53:01

标签: python pandas

我有一个熊猫数据框,它是根据某些条件融化和过滤后得到的,看起来像这样

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-02A, 2018-01-01, 2018-01-02之间有A和B,因此数据帧中的第二行。

如何在熊猫中高效执行此操作??

2 个答案:

答案 0 :(得分:3)

您可以尝试以下操作:

img{
-webkit-touch-callout: none !important; 
 -webkit-user-select: none !important; }

enter image description here


.className{-webkit-touch-callout: none !important; 
-webkit-user-select: none !important; }

输出:

enter image description here

当然,如果您有奇数个日期(如您的示例中所示),则不会捕获最后一个日期,但是可以根据需要将其附加在末尾。

答案 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