我正在从一个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
答案 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)