首页 > 解决方案 > 用新数据填充 Panda DF

问题描述

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

yday是年份,从 1 到 365;
wday是星期几,从 1 到 7;
time是一个从 1 到 144 的数字(我将一天分成 10 分钟的间隔,每天 1440 分钟/10 分钟 = 144);
stop是公交车站的编号(1-4);
N是进入公共汽车的人数

好吧,我想为每个间隙输入一个条目,每天提供 144 行,但我有一些缺失的间隙,如您所见: CSV 示例

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

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

我试图索引我DataFrame的,df.set_index['stop','yday','time']以便我可以用 to 的值重新索引它,'time'但它不起作用。我是 Python 新手,我很生气试图解决这个问题。1144

在此先感谢并为我的英语感到抱歉。

标签: pythonpandas

解决方案


为长代码道歉。但它解决了你的目的:

#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

干杯!


推荐阅读