我有以下熊猫数据框:
df = pd.DataFrame([
['A', 2017, 1],
['A', 2019, 1],
['B', 2017, 1],
['B', 2018, 1],
['C', 2016, 1],
['C', 2019, 1],
], columns=['ID', 'year', 'number'])
Run Code Online (Sandbox Code Playgroud)
并且正在寻找最有效的方法来填充缺失的年份,该列的默认值为 0 number
预期的输出是:
ID year number
0 A 2017 1
1 A 2018 0
2 A 2019 1
3 B 2017 1
4 B 2018 1
5 C 2016 1
6 C 2017 0
7 C 2018 0
8 C 2019 1
Run Code Online (Sandbox Code Playgroud)
我拥有的数据框相对较大,因此我正在寻找一种有效的解决方案。
编辑:
这是我到目前为止的代码:
min_max_dict = df[['ID', 'year']].groupby('ID').agg([min, max]).to_dict('index')
new_ix = [[], …Run Code Online (Sandbox Code Playgroud) 我的数据框如下所示
x = pd.DataFrame({'user': ['a','a','b','b'], 'dt': ['2016-01-01','2016-01-02', '2016-01-05','2016-01-06'], 'val': [1,33,2,1]})
Run Code Online (Sandbox Code Playgroud)
我希望能够做的就是找到日期列内的最小和最大的日期,并扩大该列有所有的日期出现,同时填补0了val列.所以期望的输出是
dt user val
0 2016-01-01 a 1
1 2016-01-02 a 33
2 2016-01-03 a 0
3 2016-01-04 a 0
4 2016-01-05 a 0
5 2016-01-06 a 0
6 2016-01-01 b 0
7 2016-01-02 b 0
8 2016-01-03 b 0
9 2016-01-04 b 0
10 2016-01-05 b 2
11 2016-01-06 b 1
Run Code Online (Sandbox Code Playgroud)
我从"日期"列创建了一个DatetimeIndex:
sales.index = pd.DatetimeIndex(sales["date"])
Run Code Online (Sandbox Code Playgroud)
现在索引如下:
DatetimeIndex(['2003-01-02', '2003-01-03', '2003-01-04', '2003-01-06',
'2003-01-07', '2003-01-08', '2003-01-09', '2003-01-10',
'2003-01-11', '2003-01-13',
...
'2016-07-22', '2016-07-23', '2016-07-24', '2016-07-25',
'2016-07-26', '2016-07-27', '2016-07-28', '2016-07-29',
'2016-07-30', '2016-07-31'],
dtype='datetime64[ns]', name='date', length=4393, freq=None)
Run Code Online (Sandbox Code Playgroud)
如您所见,freq属性为None.我怀疑路上的错误是由失踪引起的freq.但是,如果我尝试明确设置频率:
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-148-30857144de81> in <module>()
1 #### DEBUG
----> 2 sales_train = disentangle(df_train)
3 sales_holdout = disentangle(df_holdout)
4 result = sarima_fit_predict(sales_train.loc[5002, 9990]["amount_sold"], sales_holdout.loc[5002, 9990]["amount_sold"])
<ipython-input-147-08b4c4ecdea3> in disentangle(df_train)
2 # transform sales table to disentangle sales time series
3 sales = …Run Code Online (Sandbox Code Playgroud) 我有一个数据框,它汇总了几天的数据.我想补充一下缺少的日子
我正在关注另一篇文章,将失踪日期添加到pandas数据框中,不幸的是,它覆盖了我的结果(可能功能稍有改变?)...代码如下
import random
import datetime as dt
import numpy as np
import pandas as pd
def generate_row(year, month, day):
while True:
date = dt.datetime(year=year, month=month, day=day)
data = np.random.random(size=4)
yield [date] + list(data)
# days I have data for
dates = [(2000, 1, 1), (2000, 1, 2), (2000, 2, 4)]
generators = [generate_row(*date) for date in dates]
# get 5 data points for each
data = [next(generator) for generator in generators for _ in range(5)]
df = …Run Code Online (Sandbox Code Playgroud) 我正在尝试绘制时间序列数据,其中在某些时期没有数据。数据被加载到数据框中,我使用 绘制它df.plot()。问题在于,绘制时缺失的时期会被连接起来,给人一种该时期存在价值的印象,但实际上并不存在。
这是问题的一个例子
9 月 1 日至 9 月 8 日以及 9 月 9 日至 9 月 25 日期间没有数据,但绘制数据的方式看起来似乎该时期有值。
我希望在该时期内显示零值,或者根本没有值。怎么做?
需要明确的是,我没有 [Sep 01、Sep 08]、[Sep 09、Sep 29] 期间的 NaN 值,但根本没有数据(甚至在时间索引中也没有)。
有没有一种方法可以对两个(不同级别的)数据框重新编制索引,以使它们在所有级别上共享相同的索引?
演示:
创建一个名为“ A”的基本数据框:
index = np.array(['AUD','BRL','CAD','EUR','INR'])
data = np.random.randint(1, 20, (5,5))
A = pd.DataFrame(data=data, index=index, columns=index)
Run Code Online (Sandbox Code Playgroud)
创建一个名为“ B”的MultiIndex Dataframe:
np.random.seed(42)
midx1 = pd.MultiIndex.from_product([['Bank_1', 'Bank_2'],
['AUD','CAD','EUR']], names=['Bank', 'Curency'])
B = pd.DataFrame(np.random.randint(10,25,6), midx1)
B.columns = ['Notional']
Run Code Online (Sandbox Code Playgroud)
基本DF:
>>> Dataframe A:
AUD BRL CAD EUR INR
AUD 7 19 11 11 4
BRL 8 3 2 12 6
CAD 2 1 12 12 17
EUR 10 16 15 15 19
INR 12 3 5 19 7
Run Code Online (Sandbox Code Playgroud)
MultiIndex DF:
>>> Dataframe B:
Notional …Run Code Online (Sandbox Code Playgroud) 我正在使用一个多索引数据框,该数据框以日期列和 location_id 作为索引。
index_1 = ['2020-01-01', '2020-01-03', '2020-01-04']
index_2 = [100,200,300]
index = pd.MultiIndex.from_product([index_1,
index_2], names=['Date', 'location_id'])
df = pd.DataFrame(np.random.randint(10,100,9), index)
df
0
Date location_id
2020-01-01 100 19
200 75
300 39
2020-01-03 100 11
200 91
300 80
2020-01-04 100 36
200 56
300 54
Run Code Online (Sandbox Code Playgroud)
我想填写缺失的日期,只用一个 location_id 并用 0 填充:
0
Date location_id
2020-01-01 100 19
200 75
300 39
2020-01-02 100 0
2020-01-03 100 11
200 91
300 80
2020-01-04 100 36
200 56
300 54
Run Code Online (Sandbox Code Playgroud)
我怎样才能做到这一点?这很有帮助 …
我尝试解析一个如下所示的 CSV 文件:
dd.mm.yyyy value
01.01.2000 1
02.01.2000 2
01.02.2000 3
Run Code Online (Sandbox Code Playgroud)
我需要添加缺失的日期并用NaN根据值填充。我Series.reindex在这个问题中使用过:
import pandas as pd
ts=pd.read_csv(file, sep=';', parse_dates='True', index_col=0)
idx = pd.date_range('01.01.2000', '02.01.2000')
ts.index = pd.DatetimeIndex(ts.index)
ts = ts.reindex(idx, fill_value='NaN')
Run Code Online (Sandbox Code Playgroud)
但结果是,由于日期格式(即 mm/dd 而不是 dd/mm),某些日期的值会被交换:
01.01.2000 1
02.01.2000 3
03.01.2000 NaN
...
...
31.01.2000 NaN
01.02.2000 2
Run Code Online (Sandbox Code Playgroud)
我尝试了几种方法(即添加dayfirst=True到read_csv)来做对,但仍然无法弄清楚。请帮忙。
pandas ×8
python ×7
dataframe ×3
time-series ×2
date ×1
indexing ×1
multi-index ×1
nan ×1
plot ×1