【问题标题】:Fill Panda DF with new data用新数据填充 Pandas DF
【发布时间】:2020-08-16 02:45:38
【问题描述】:

这是我在 StackOverflow 上的第一篇文章。如果我做错了什么或违反了网络规则,我深表歉意。 我的问题:我有一个在 python 中使用pandas 读取的 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 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 编制索引,这样我就可以用从1144'time' 值重新编制它,但它不起作用。我是 Python 新手,想解决这个问题我很生气。

在此先感谢,对不起我的英语。

【问题讨论】:

标签: python pandas


【解决方案1】:

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

#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

干杯!

【讨论】:

  • 伙计,你无法想象我现在有多爱你,它有效! tytytyty
猜你喜欢
  • 2020-09-16
  • 1970-01-01
  • 1970-01-01
  • 2022-08-14
  • 2017-06-22
  • 1970-01-01
  • 2022-06-13
  • 2020-12-29
  • 1970-01-01
相关资源
最近更新 更多