数据框索引按字母顺序排序

时间:2019-09-03 03:53:41

标签: python pandas csv plot graph

我正在从一个csv文件中读取数据帧,并且尝试创建一个时间图,该时间图表示票证的发布时间和票证的发布频率。包含时间的列以小时格式设置,字母表示am或pm,即1200A。因此,当我尝试按升序对数据帧进行排序时,仅考虑数值,而忽略A,P。如何对数据帧的索引进行排序以考虑A和P

我尝试使用sort_index  功能,但仅适用于数字排序

from matplotlib 
import pyplot as plt 
import pandas as pd
tickets = pd.read_csv("./Parking_Violations_Issued_-_Fiscal_Year_2019.csv")

d2=tickets['Violation Time'].value_counts()
df2=d2.sort_index(ascending=1, sort_remaining='true')   

样本数据集:

Index  Violation Time
.847A   1
0000A   801
0000P   22
0001A   545
0001P   1
0002A   499
0003A   520
0004A   498
0004P   1
0005A   619
0006A   983
0007A   993
0008A   1034
0008P   1
0009A   1074

原始CSV link

2 个答案:

答案 0 :(得分:1)

这将完成您的工作。

说明:

  • 首先,我将您的时间列转换为元组,例如[('.847', 'A'), ('0000', 'A'), ('0001', 'A') ...
  • 接下来,我已根据您的逻辑(即second element('A', 'P') of tuple and then first element(numbers))进行了排序,并加入了这些元组以恢复其原始状态。
  • 最后与原始数据集合并以获得所需的输出。

代码:

>>> tickets # Assuming your initial dataframe looks like below, as mentioned in OP
    Index  Violation Time
0   .847A          1  
1   0000A        801   
2   0000P         22   
3   0001A        545   
4   0001P          1   
5   0002A        499   
6   0003A        520   
7   0004A        498   
8   0004P          1   
9   0005A        619   
10  0006A        983   
11  0007A        993   
12  0008A       1034   
13  0008P          1   
>>> final_df = pd.DataFrame(["".join(i) for i in sorted(tickets.apply(lambda x: (x['Index'][:-1], x['Index'][-1]), axis=1), key=lambda x : (x[1], x[0]))])
>>> df2.rename(columns={0:'Index'}, inplace=True)

输出:

>>> final_df.merge(tickets)
    Index  Violation Time
0   .847A          1   
1   0000A        801   
2   0001A        545   
3   0002A        499   
4   0003A        520   
5   0004A        498  
6   0005A        619   
7   0006A        983   
8   0007A        993   
9   0008A       1034   
10  0009A       1074   
11  0000P         22   
12  0001P          1   
13  0004P          1   
14  0008P          1   

答案 1 :(得分:0)

我会考虑编写一种算法,将时间字符串解析为您想要的排序顺序。

如果确实每个Violation Time的最后一个字符都有A或P,则可以创建一个新的排序列,该列将时间字符串解析为datetime对象。根据数据的脏度,您将不得不为小时和分钟子字符串添加一些其他的解析检查,但这是一个很好的开始:

编辑:我添加了对长度和字符串类型的检查,以确保在解析之前可以对字符串进行解析。

from datetime import datetime
import pandas as pd
def parseDateTime(x, tformat='%I%M%p'):
    if pd.isnull(x):
        return None
    if type(x) is str and len(x) == 5:
        if x[0:2].isdigit() and x[2:4].isdigit():
            newString = str(x).strip() + 'M'
            parsedDateTime = datetime.strptime(newString,tformat)
            return parsedDateTime
    else:
        return None

请注意,如果没有日期信息,则所有时间都将视为同一天。

现在,您可以将此功能应用于列,然后将新的已分析列用于排序。

tickets['Violation Time Parsed'] = tickets['Violation Time'].apply(parseDateTime)
相关问题