Python 按字母顺序对数据帧的索引排序

Python 按字母顺序对数据帧的索引排序,python,pandas,csv,plot,graph,Python,Pandas,Csv,Plot,Graph,我从一个csv文件中读取数据帧,并试图创建一个时间图,根据发行票证的频率显示何时发行票证。包含时间的列以小时格式设置,字母表示am或pm,即1200A。因此,当我尝试按升序排序数据帧时,只考虑数值,而忽略A,P。如何排序我的数据帧的索引以考虑a和p 我尝试过使用sort\u索引 函数,但仅在对数字进行排序时起作用 from matplotlib import pyplot as plt import pandas as pd tickets = pd.read_csv("./Parking_

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

我尝试过使用
sort\u索引
函数,但仅在对数字进行排序时起作用

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

<>原始CSV < /P> < P>我会考虑编写一个算法来将时间字符串解析为你想要的排序顺序。
如果确实每个
冲突时间
的最后一个字符都有A或p,则可以创建一个新的排序列,将时间字符串解析为datetime对象。根据数据的脏程度,您必须为小时和分钟子字符串添加一些额外的解析检查,但这是一个良好的开端:

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

从日期时间导入日期时间
作为pd进口熊猫
def parseDateTime(x,t格式=“%I%M%p”):
如果pd.isnull(x):
一无所获
如果类型(x)为str且len(x)==5:
如果x[0:2].isdigit()和x[2:4].isdigit():
newString=str(x).strip()+'M'
parsedDateTime=datetime.strtime(新闻字符串,tformat)
返回parsedDateTime
其他:
一无所获
请注意,如果没有日期信息,所有时间都将被视为在同一天

现在,您可以将此函数应用于列,然后使用新解析的列进行排序

tickets['provision Time Parsed']=tickets['provision Time'].应用(parseDateTime)
这将完成您的工作

说明:

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
>>> 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   
  • 首先,我用tuple转换了时间列,比如
    [('.847','A'),('0000','A'),('0001','A')…
  • 接下来,我根据您的逻辑进行排序,即元组的第二个元素('A','P'),然后是第一个元素(数字),并将这些元组连接起来以返回其原始状态
  • 最后与原始数据集合并以获得所需的输出
代码:

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

输出:

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

@shaikmoeed我认为我的列没有任何正式格式。它没有像DD-MM-YYYY这样的标准格式,例如dateI获取错误时间数据“nanM”与格式“%I%M%p”不匹配,我的一些行没有数据,一些行(很少)包含数据不包含P或ADE取决于数据的脏程度,您必须为小时和分钟子字符串添加一些额外的解析检查。如果将数据放入新的数据帧中,我将使用什么条件?例如:newdf=tickets[tickets['违例时间]==conditional]使用上面的解析器,您可以使用datetime功能来检查小时和分钟。类似于t[((t['vtime'].dt.hour==12)和(t['vtime'].dt.minute==0))]注意,时间转换为军事时间,所以要检查下午2:00,您需要检查hour==14I get error
()得到一个意外的关键字参数“axis”
@Kayla您错误地关闭了lambda的括号。我建议复制粘贴代码或再次检查。@Kayla如果它解决了您的问题,请不要忘记接受答案。moood
df3=pd.DataFrame([“”.join(I)for I in in sorted(df2.apply)(lambda x:“Index'][:-1],x[“Index'][-1]),axis=1),key=lambda x:(x[1],x[0])]))df3.rename(columns={0:'Index'},inplace=True)df3.merge(df2)
这是我的确切代码,我缺少什么???@Kayla您在
排序(df2.apply…
中使用
df2
。将其更改为
排序(df.apply…
,如答案中所述。