用新数据填充PandasDF

2024-09-30 16:19:47 发布

您现在位置:Python中文网/ 问答频道 /正文

这是我关于StackOverflow的第一篇文章。如果我做错了什么或违反了网络规则,我表示歉意。 我的问题是:我在python中使用pandas读取了一个csv文件。dataframe有五列,名为[yday, wday, time, stop, N]

yday是一年中的一天,从1到365
wday是一周中的一天,从1到7
time是一个1-144之间的数字(我把一天分成10分钟的间隔,每天1440分钟/10分钟=144)
stop是公共汽车站的编号(1-4)
N是进入总线的ppl数

好吧,我想为每个间隙设置一个条目,每天给出144行,但我有一些缺失的间隙,如您所见: CSV example

我的目标是添加新行以填补所有时间间隔,例如添加(基于给定的图像):

320,6,81,1,1 <-- Exists

320,6,82,1,na <-- New 

320,6,83,1,na <-- New

320,6,84,1,na <-- New

320,6,85,1,1 <-- Exists

我试图用df.set_index['stop','yday','time']索引我的DataFrame,这样我就可以用'time'值从1重新索引到144,但它不起作用。我是Python新手,想解决这个问题我都快疯了

提前谢谢,我的英语很抱歉


Tags: csv网络pandasnew间隔time规则exists
1条回答
网友
1楼 · 发布于 2024-09-30 16:19:47

抱歉代码太长。但它解决了你的目的:

#Specify the input csv file path here. I am assuming your csv has only 
#the columns and column names you mentioned in your question. If not you have to 
#modify the below code to reflect your changed columns
df = pd.read_csv("Path_to_your_input_csv_file_here") 

df = df.sort_values(['yday', 'wday', 'time'], ascending=True) #Sort df values based upon yday, wday and time first
df = df.reset_index(drop=True) #Reset the indices after sorting

df2 = df.copy(deep=True) #Make a deep copy of this sorted dataframe

#The below for loop iterates through rows of 'df', finds differences between time values and adds up missing rows to 'df2'
for index, row in df.iterrows(): #Iterate through the rows of df
    if index == len(df)-1:
        break
    else:
        if row["yday"] == df.loc[index+1,"yday"] and row["wday"] == df.loc[index+1,"wday"] and row["time"] < df.loc[index+1,"time"]:
            differences = list(range(row["time"]+1,df.loc[index+1,"time"]))
            for item in differences:
                tempdf = pd.DataFrame([[row["yday"], row["wday"],item, row['stop'], 'NA' ]],columns = df2.columns)
                df2 = df2.append(tempdf)

#Now sort 'df2' based upon yday,wday and time
df2 = df2.sort_values(['yday', 'wday', 'time'], ascending=True)
df2 = df2.reset_index(drop=True) #Reset indices

print(df2)

输出:

    yday  wday  time  stop   N
0    320     6    81     1   1
1    320     6    82     1  NA
2    320     6    83     1  NA
3    320     6    84     1  NA
4    320     6    85     1   1
5    320     6    86     1  NA
6    320     6    87     1  NA
7    320     6    88     1  NA
8    320     6    89     1   1
9    320     6    90     1  NA
10   320     6    91     1  NA
11   320     6    92     1  NA
12   320     6    93     1   1
13   320     6    94     1  NA
14   320     6    95     1  NA
15   320     6    96     1  NA
16   320     6    97     1   1

干杯

相关问题 更多 >