Python 按字母顺序对数据帧的索引排序
我从一个csv文件中读取数据帧,并试图创建一个时间图,根据发行票证的频率显示何时发行票证。包含时间的列以小时格式设置,字母表示am或pm,即1200A。因此,当我尝试按升序排序数据帧时,只考虑数值,而忽略A,P。如何排序我的数据帧的索引以考虑a和p 我尝试过使用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_
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如果它解决了您的问题,请不要忘记接受答案。moooddf3=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…
,如答案中所述。