我有几个不同的结束时间段。
需要用最后一个已知值填充空数据。
有没有Pandas的方法来做到这一点而不在结束日期循环基础?
过去4个月我需要将gain_sum_y等于-57129.0。
gain_sum_x gain_sum_y
month
2014-09-30 -97747 -41355.0
2014-10-31 -112928 -47394.0
2014-11-30 -131638 -57129.0
2014-12-31 -161370 0.0
2015-01-31 -168832 0.0
2015-02-28 -151930 0.0
2015-03-31 -162077 0.0
感谢。
答案 0 :(得分:3)
如果您希望将所有ffill
值替换为最后一个非method='ffill'
值,我认为您需要replace
0
fillna
0
} :
df = df.replace(0, np.nan).ffill()
print (df)
month gain_sum_x gain_sum_y
0 2014-09-30 -97747 -41355.0
1 2014-10-31 -112928 -47394.0
2 2014-11-30 -131638 -57129.0
3 2014-12-31 -161370 -57129.0
4 2015-01-31 -168832 -57129.0
5 2015-02-28 -151930 -57129.0
6 2015-03-31 -162077 -57129.0
如果要指定要替换的列(谢谢John Galt):
df.replace({'gain_sum_y': {0: np.nan}}).ffill()
多个0
的示例:
print (df)
gain_sum_x gain_sum_y
month
2014-09-30 -97747 -41355.0
2014-10-31 0 0.0
2014-11-30 0 -57129.0
2014-12-31 -161370 0.0
2015-01-31 -168832 0.0
2015-02-28 0 0.0
2015-03-31 -162077 0.0
df1 = df.replace(0,np.nan).ffill()
print (df1)
gain_sum_x gain_sum_y
month
2014-09-30 -97747.0 -41355.0
2014-10-31 -97747.0 -41355.0
2014-11-30 -97747.0 -57129.0
2014-12-31 -161370.0 -57129.0
2015-01-31 -168832.0 -57129.0
2015-02-28 -168832.0 -57129.0
2015-03-31 -162077.0 -57129.0
但是如果需要仅替换最后0
需要last_valid_index
,则将0
替换为NaN
:
df2 = df.replace(0,np.nan).apply(lambda x: x.loc[:x.last_valid_index()].fillna(0)).ffill()
print (df2)
gain_sum_x gain_sum_y
2014-09-30 -97747.0 -41355.0
2014-10-31 0.0 0.0
2014-11-30 0.0 -57129.0
2014-12-31 -161370.0 -57129.0
2015-01-31 -168832.0 -57129.0
2015-02-28 0.0 -57129.0
2015-03-31 -162077.0 -57129.0
答案 1 :(得分:1)
试试这个:
df.fillna(method='pad')
有几个具有不同结束时间段的列。
需要用最后一个已知值填充空数据。
有没有一种 Pandas 方法可以在不循环结束日期的情况下做到这一点?
我需要过去 4 个月的 gain_sum_y 等于 -57129.0。
月 | gain_sum_x | gain_sum_y -|-|- 2014-09-30| -97747| -41355.0 2014-10-31| -112928| -47394.0 2014-11-30| -131638| -57129.0 2014-12-31| -161370| 0.0 2015-01-31| -168832| 0.0 2015-02-28| -151930| 0.0 2015-03-31| -162077| 0.0 谢谢。
答案 2 :(得分:0)
import pandas as pd
import datetime
df = pd.read_csv("data.txt")
df['month'] = pd.to_datetime(df['month'])
mask = df['month'] > datetime.datetime.strptime("2014-12-01",'%Y-%m-%d')
df['gain_sum_y'][mask] = -57129.0
df
month gain_sum_x gain_sum_y
0 2014-09-30 -97747 -41355.0
1 2014-10-31 -112928 -47394.0
2 2014-11-30 -131638 -57129.0
3 2014-12-31 -161370 -57129.0
4 2015-01-31 -168832 -57129.0
5 2015-02-28 -151930 -57129.0
6 2015-03-31 -162077 -57129.0
答案 3 :(得分:0)
以下是我的工作:
# loop through all the columns
for i, column in enumerate ( df.columns ):
# find the last row with value not zero
x = df [ df[column] != 0 ].index [ -1 ]
# get the last value before the zero values
y = df[column] [x]
# find and fill the rows greater than date "x" with value "y"
mask = (df.index > x)
df[column] [ mask ] = y
我希望这是好熊猫。感谢所有人。