假设我有一个时间序列:
In[138] rng = pd.date_range('1/10/2011', periods=10, freq='D')
In[139] ts = pd.Series(randn(len(rng)), index=rng)
In[140]
Out[140]:
2011-01-10 0
2011-01-11 1
2011-01-12 2
2011-01-13 3
2011-01-14 4
2011-01-15 5
2011-01-16 6
2011-01-17 7
2011-01-18 8
2011-01-19 9
Freq: D, dtype: int64
Run Code Online (Sandbox Code Playgroud)
如果我使用其中一个rolling_*函数,例如rolling_sum,我可以获得我想要的向后看滚动计算的行为:
In [157]: pd.rolling_sum(ts, window=3, min_periods=0)
Out[157]:
2011-01-10 0
2011-01-11 1
2011-01-12 3
2011-01-13 6
2011-01-14 9
2011-01-15 12
2011-01-16 15
2011-01-17 18
2011-01-18 21
2011-01-19 24
Freq: D, dtype: float64
Run Code Online (Sandbox Code Playgroud)
但是,如果我想做一个前瞻性的总和怎么办?我尝试过这样的事情:
In [161]: pd.rolling_sum(ts.shift(-2, freq='D'), window=3, min_periods=0)
Out[161]:
2011-01-08 0
2011-01-09 …
Run Code Online (Sandbox Code Playgroud) 我有一个从csv文件创建的pandas数据框.此数据框的一列包含最初强制转换为字符串的数字数据.大多数条目都是类似数字的,但有些条目包含非数字的各种错误代码.我事先不知道所有的错误代码是什么或有多少.因此,例如,数据框可能如下所示:
[In 1]: df
[Out 1]:
data OtherAttr
MyIndex
0 1.4 aaa
1 error1 foo
2 2.2 bar
3 0.8 bar
4 xxx bbb
...
743733 BadData ccc
743734 7.1 foo
Run Code Online (Sandbox Code Playgroud)
我想将df.data
其转换为浮点数并抛弃任何无法正确转换的值.这是否有内置功能?就像是:
df.data = df.data.astype(float, skipbad = True)
Run Code Online (Sandbox Code Playgroud)
(虽然我知道具体不起作用,但我没有看到任何形式的kwargs做我想做的事)
我想我可以编写一个函数try
然后使用pandas apply
或者map
,但这似乎是一个不优雅的解决方案.这一定是一个相当普遍的问题,对吧?
假设我有一个像这样的pandas数据帧:
cat val
0 a 1
1 a 6
2 a 12
3 b 2
4 b 5
5 b 11
6 c 4
7 c 22
Run Code Online (Sandbox Code Playgroud)
我想知道,对于每个类别('cat'的每个值),值最接近给定值的位置是什么,比如说5.5.我可以减去我的目标值并取绝对值,给我这样的东西:
cat val val_delt
0 a 1 4.5
1 a 6 0.5
2 a 12 6.5
3 b 2 3.5
4 b 5 0.5
5 b 11 5.5
6 c 4 1.5
7 c 22 16.5
Run Code Online (Sandbox Code Playgroud)
但是我不知道下一步要去哪里.我的第一个想法是使用argmin()和groupby(),但这给出了一个错误:
In [375]: df.groupby('cat').val_delt.argmin()
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-375-a2c3dbc43c50> in <module>()
----> 1 df.groupby('cat').val_delt.argmin() …
Run Code Online (Sandbox Code Playgroud) 我使用.xs或.loc(它们似乎表现相同)通过索引提取我的数据帧的子集.当我的条件检索多行时,结果将保留一个数据帧.当只检索到一行时,它会自动转换为一个系列.我不希望这种行为,因为这意味着我需要处理下游的多个案例(可用于系列和数据帧的不同方法集).
In [1]: df = pd.DataFrame({'a':range(7), 'b':['one']*4 + ['two'] + ['three']*2,
'c':range(10,17)})
In [2]: df.set_index('b', inplace=True)
In [3]: df.xs('one')
Out[3]:
a c
b
one 0 10
one 1 11
one 2 12
one 3 13
In [4]: df.xs('two')
Out[4]:
a 4
c 14
Name: two, dtype: int64
In [5]: type(df.xs('two'))
Out [5]: pandas.core.series.Series
Run Code Online (Sandbox Code Playgroud)
我可以手动将该系列转换回数据帧,但它看起来很麻烦,还需要进行案例测试,看看我是否应该这样做.是否有一种更简洁的方法可以让数据帧重新开始?