jfi*_*ive 6 python group-by slice dataframe pandas
我有以下代码设置,可以调用 groupBy 并应用于 Python Pandas DataFrame。
奇怪的是,我无法按行对分组数据进行切片(例如df.loc[2:5]),而不完全破坏输出(如调试中所示),如何删除行并得到所需的输出?
任何帮助将不胜感激,我正在一个具有更复杂功能的更大示例上运行它,但已经查明了行切片的问题!
代码:
import pandas as pd
df = pd.DataFrame({'one' : ['AAL', 'AAL', 'AAPL', 'AAPL'], 'two' : [1, 2, 3, 4]})
def net_func(df):
df_res = daily_func(df, True)
df_res_valid = daily_func(df, False)
df_merge = pd.merge(df_res, df_res_valid)
return df_merge
def daily_func(df, bool_param):
# df.drop(df.head(1).index, inplace=True)
# df = df[1:1]
# df.iloc[1:1,:]
# df.loc[1:1,:]
if bool_param:
df['daily'+str(bool_param)] = 1
else:
df['daily'+str(bool_param)] = 0
return df
print df.groupby('one').apply(net_func)
Run Code Online (Sandbox Code Playgroud)
电流输出:
one two dailyTrue dailyFalse
one
AAL 0 AAL 1 1 0
1 AAL 2 1 0
AAPL 0 AAPL 1 1 0
1 AAPL 2 1 0
Run Code Online (Sandbox Code Playgroud)
期望的输出:
one two dailyTrue dailyFalse
one
AAL 1 AAL 2 1 0
AAPL 1 AAPL 2 1 0
Run Code Online (Sandbox Code Playgroud)
理想情况下,我希望能够为每个组按行进行切片df.loc[3:5]- 这将是完美的!
我尝试过评论如下:
输出df.drop(df.head(1).index, inplace=True):
Empty DataFrame
Columns: [one, two, dailyTrue, dailyFalse]
Index: []
Run Code Online (Sandbox Code Playgroud)
更新:还尝试了输出df = df[1:1]:
Empty DataFrame
Columns: [one, two, dailyTrue, dailyFalse]
Index: []
Run Code Online (Sandbox Code Playgroud)
更新也尝试过df.iloc[1:1,:]:
one two dailyTrue dailyFalse
one
AAL 0 AAL 1 1 0
1 AAL 2 1 0
AAPL 0 AAPL 1 1 0
1 AAPL 2 1 0
Run Code Online (Sandbox Code Playgroud)
和df.loc[1:1,:]:
one two dailyTrue dailyFalse
one
AAL 0 AAL 1 1 0
1 AAL 2 1 0
AAPL 0 AAPL 1 1 0
1 AAPL 2 1 0
Run Code Online (Sandbox Code Playgroud)
考虑使用横截面切片,xs在 后groupby().apply()相应地指定每个键:
print df.groupby('one').apply(net_func).xs(0, level=1)
# one two dailyTrue dailyFalse
#one
#AAL AAL 1 1 0
#AAPL AAPL 1 1 0
print df.groupby('one').apply(net_func).xs(1, level=1)
# one two dailyTrue dailyFalse
#one
#AAL AAL 2 1 0
#AAPL AAPL 2 1 0
Run Code Online (Sandbox Code Playgroud)
或者,对元组列表使用多重索引:
print df.groupby('one').apply(net_func).ix[[('AAL', 1), ('AAPL', 1)]]
# one two dailyTrue dailyFalse
#one
#AAL 1 AAL 2 1 0
#AAPL 1 AAPL 2 1 0
Run Code Online (Sandbox Code Playgroud)
还有更多关于 slice 的内容(在 pandas 0.14 中引入):
print df.groupby('one').apply(net_func).loc[(slice('AAL','AAPL'),slice(1,1)),:]
# one two dailyTrue dailyFalse
#one
#AAL 1 AAL 2 1 0
#AAPL 1 AAPL 2 1 0
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
18480 次 |
| 最近记录: |