对熊猫中的列值进行排序以创建备用序列

时间:2019-05-01 20:23:01

标签: python pandas

我想根据字符串的最后一个字符为数据框创建替代顺序。

这是一个示例数据框:

import pandas as pd
df = pd.DataFrame({'Date': ('2019-01-01', '2019-01-01', '2019-01-02', '2019-01-02', '2019-01-02', '2019-01-02'),
                  'Account': ('123A', '123B', '456A', '456A', '456B', '456B'),
                  'Type': ('1', '1', '2', '2', '2', '2')})

df = df.sort_values(['Date', 'Type'])
df
         Date Account Type
0  2019-01-01    123A    1
1  2019-01-01    123B    1
2  2019-01-02    456A    2
3  2019-01-02    456A    2
4  2019-01-02    456B    2
5  2019-01-02    456B    2

我想要的输出是:

         Date Account Type
0  2019-01-01    123A    1
1  2019-01-01    123B    1
2  2019-01-02    456A    2
4  2019-01-02    456B    2
3  2019-01-02    456A    2
5  2019-01-02    456B    2

如果您看一下第2行和第4行,您会发现the的最后一个字符是备用字符。所以基本上,我想按日期,类型和df ['Account']。str [-1:]进行排序,其中df ['Account']。str [-1:]始终是同一根的交替AB,AB在帐户中。

我试图创建新列来识别有问题的行,但是不知道如何重新排序。

df['test1'] = np.where((df['Account'].str[:3].shift(-1) == df['Account'].str[:3]) & (df['Account'].str[-1:].shift(-1) == 'B') & (df['Account'].str[-1:] == 'B'), 1, 0)

1 个答案:

答案 0 :(得分:3)

尝试一下:

df['rank'] = df.groupby(['Date','Type', 'Account']).cumcount()
df.sort_values(['Date', 'Type', 'rank'])

输出:

+----+---------------------+-----------+--------+--------+
|    | Date                | Account   |   Type |   rank |
|----+---------------------+-----------+--------+--------|
|  0 | 2019-01-01 00:00:00 | 123A      |      1 |      0 |
|  1 | 2019-01-01 00:00:00 | 123B      |      1 |      0 |
|  2 | 2019-01-02 00:00:00 | 456A      |      2 |      0 |
|  4 | 2019-01-02 00:00:00 | 456B      |      2 |      0 |
|  3 | 2019-01-02 00:00:00 | 456A      |      2 |      1 |
|  5 | 2019-01-02 00:00:00 | 456B      |      2 |      1 |
+----+---------------------+-----------+--------+--------+