我有一个包含面板数据的数据框,假设它是 100 个不同对象的时间序列:
object period value
1 1 24
1 2 67
...
1 1000 56
2 1 59
2 2 46
...
2 1000 64
3 1 54
...
100 1 451
100 2 153
...
100 1000 21
Run Code Online (Sandbox Code Playgroud)
我想添加一个新列prev_value,它将value为每个对象存储以前的内容:
object period value prev_value
1 1 24 nan
1 2 67 24
...
1 99 445 1243
1 1000 56 445
2 1 59 nan
2 2 46 59
...
2 1000 64 784
3 …Run Code Online (Sandbox Code Playgroud) 我曾经和R一起工作,真的很喜欢你可以轻松分组并总结的dplyr软件包.
但是,在pandas中,我没有看到相当的总结,这是我在Python中实现它的方式:
import pandas as pd
data = pd.DataFrame(
{'col1':[1,1,1,1,1,2,2,2,2,2],
'col2':[1,2,3,4,5,6,7,8,9,0],
'col3':[-1,-2,-3,-4,-5,-6,-7,-8,-9,0]
}
)
result = []
for k,v in data.groupby('col1'):
result.append([k, max(v['col2']), min(v['col3'])])
print pd.DataFrame(result, columns=['col1', 'col2_agg', 'col3_agg'])
Run Code Online (Sandbox Code Playgroud)
它不仅非常冗长,而且可能不是最优化和最有效的.(我曾经重写过一个dplyr实现for-loop groupby,性能提升很大).
在R中代码将是
data %>% groupby(col1) %>% summarize(col2_agg=max(col2), col3_agg=min(col3))
Run Code Online (Sandbox Code Playgroud)
在Python或for循环中是否有一个有效的等价物是我必须使用的.
另外,@ ahan真的给了我答案的解决方案,这是一个后续问题,我将在这里列出而不是评论:
什么是相当于 groupby.agg
我无法弄清楚Pandas .aggregate和.apply功能之间的区别.
以下面的例子为例:我加载一个数据集,做一个groupby,定义一个简单的函数,以及用户.agg或.apply.
正如您所看到的,使用.agg和后,我的函数中的打印语句会产生相同的输出.apply.结果,另一方面是不同的.这是为什么?
import pandas
import pandas as pd
iris = pd.read_csv('iris.csv')
by_species = iris.groupby('Species')
def f(x):
...: print type(x)
...: print x.head(3)
...: return 1
Run Code Online (Sandbox Code Playgroud)
使用apply:
by_species.apply(f)
#<class 'pandas.core.frame.DataFrame'>
# Sepal.Length Sepal.Width Petal.Length Petal.Width Species
#0 5.1 3.5 1.4 0.2 setosa
#1 4.9 3.0 1.4 0.2 setosa
#2 4.7 3.2 1.3 0.2 setosa
#<class 'pandas.core.frame.DataFrame'>
# Sepal.Length Sepal.Width Petal.Length Petal.Width Species
#0 5.1 …Run Code Online (Sandbox Code Playgroud) 我知道这肯定已经回答了一些地方,但我找不到它.
问题:在groupby操作后对每个组进行采样.
import pandas as pd
df = pd.DataFrame({'a': [1,2,3,4,5,6,7],
'b': [1,1,1,0,0,0,0]})
grouped = df.groupby('b')
# now sample from each group, e.g., I want 30% of each group
Run Code Online (Sandbox Code Playgroud) 我有一个看起来像这样的DataFrame:
+----------+---------+-------+
| username | post_id | views |
+----------+---------+-------+
| john | 1 | 3 |
| john | 2 | 23 |
| john | 3 | 44 |
| john | 4 | 82 |
| jane | 7 | 5 |
| jane | 8 | 25 |
| jane | 9 | 46 |
| jane | 10 | 56 |
+----------+---------+-------+
Run Code Online (Sandbox Code Playgroud)
我想将它转换为计算属于某些二进制文件的视图:
+------+------+-------+-------+--------+
| | 1-10 | 11-25 | 25-50 | 51-100 |
+------+------+-------+-------+--------+ …Run Code Online (Sandbox Code Playgroud) 我有一个列Date_Time,我希望按日期时间分组而不创建新列.这可能是我当前的代码不起作用.
df = pd.groupby(df,by=[df['Date_Time'].date()])
Run Code Online (Sandbox Code Playgroud) 我想df.groupby()结合使用apply()将函数应用于每组的每一行.
我通常使用以下代码,这通常有效(请注意,这是没有的groupby()):
df.apply(myFunction, args=(arg1,))
Run Code Online (Sandbox Code Playgroud)
随着groupby()我尝试了以下内容:
df.groupby('columnName').apply(myFunction, args=(arg1,))
Run Code Online (Sandbox Code Playgroud)
但是,我收到以下错误:
TypeError:myFunction()得到一个意外的关键字参数'args'
因此,我的问题是:我如何使用groupby()和apply()需要参数的函数?
好吧,我有一个数据框,其中包含时间序列数据,每个列都有一个多行索引.以下是数据外观的示例,它采用csv格式.加载数据不是问题.
我想要做的是能够根据multiinex特定行中的不同类别创建一个包含此数据的箱线图.例如,如果我按'SPECIES'进行分组,我会在时间序列的特定时间为每个组提供组,'aq','gr','mix','sed'和一个框.
我试过这个:
grouped = data['2013-08-17'].groupby(axis=1, level='SPECIES')
grouped.boxplot()
Run Code Online (Sandbox Code Playgroud)
但是它为组中的每个点而不是分组集提供了一个箱线图(扁平线).是否有捷径可寻?我没有任何问题分组,因为我可以按照我想要的方式聚合组,但我不确定我在这个盒子图中做错了什么.
任何帮助,将不胜感激.
我有一个脚本,该脚本生成具有数量不定的值列的熊猫数据框。例如,此df可能是
import pandas as pd
df = pd.DataFrame({
'group': ['A', 'A', 'A', 'B', 'B'],
'group_color' : ['green', 'green', 'green', 'blue', 'blue'],
'val1': [5, 2, 3, 4, 5],
'val2' : [4, 2, 8, 5, 7]
})
group group_color val1 val2
0 A green 5 4
1 A green 2 2
2 A green 3 8
3 B blue 4 5
4 B blue 5 7
Run Code Online (Sandbox Code Playgroud)
My goal is to get the grouped mean for each of the value columns. In this …
使用样本数据:
df = pd.DataFrame({'key1' : ['a','a','b','b','a'],
'key2' : ['one', 'two', 'one', 'two', 'one'],
'data1' : np.random.randn(5),
'data2' : np. random.randn(5)})
Run Code Online (Sandbox Code Playgroud)
DF
data1 data2 key1 key2
0 0.361601 0.375297 a one
1 0.069889 0.809772 a two
2 1.468194 0.272929 b one
3 -1.138458 0.865060 b two
4 -0.268210 1.250340 a one
Run Code Online (Sandbox Code Playgroud)
我试图找出如何按key1对数据进行分组,并仅将key2等于'one'的data1值相加.
这是我尝试过的
def f(d,a,b):
d.ix[d[a] == b, 'data1'].sum()
df.groupby(['key1']).apply(f, a = 'key2', b = 'one').reset_index()
Run Code Online (Sandbox Code Playgroud)
但这给了我一个"无"值的数据框
index key1 0
0 a None
1 b None
Run Code Online (Sandbox Code Playgroud)
这里有什么想法?我正在寻找与以下SQL相当的Pandas:
SELECT Key1, SUM(CASE WHEN …Run Code Online (Sandbox Code Playgroud)