我从这样的输入数据开始
df1 = pandas.DataFrame( {
"Name" : ["Alice", "Bob", "Mallory", "Mallory", "Bob" , "Mallory"] ,
"City" : ["Seattle", "Seattle", "Portland", "Seattle", "Seattle", "Portland"] } )
Run Code Online (Sandbox Code Playgroud)
打印时显示如下:
City Name
0 Seattle Alice
1 Seattle Bob
2 Portland Mallory
3 Seattle Mallory
4 Seattle Bob
5 Portland Mallory
Run Code Online (Sandbox Code Playgroud)
分组很简单:
g1 = df1.groupby( [ "Name", "City"] ).count()
Run Code Online (Sandbox Code Playgroud)
和打印产生一个GroupBy对象:
City Name
Name City
Alice Seattle 1 1
Bob Seattle 2 2
Mallory Portland 2 2
Seattle 1 1
Run Code Online (Sandbox Code Playgroud)
但我最终想要的是另一个包含GroupBy对象中所有行的DataFrame对象.换句话说,我希望得到以下结果:
City Name
Name …Run Code Online (Sandbox Code Playgroud) 我有一个数据框df,我使用它的几个列groupby:
df['col1','col2','col3','col4'].groupby(['col1','col2']).mean()
Run Code Online (Sandbox Code Playgroud)
以上面的方式,我几乎得到了我需要的表(数据框).缺少的是包含每个组中行数的附加列.换句话说,我有意思,但我也想知道有多少数字被用来获得这些手段.例如,在第一组中有8个值,在第二组中有10个,依此类推.
我见过很多关于数据透视表的问题.即使他们不知道他们询问数据透视表,他们通常也是.几乎不可能写出一个规范的问题和答案,其中包含了旋转的所有方面....
......但是我要试一试.
现有问题和答案的问题在于,问题通常集中在OP难以概括以便使用一些现有的良好答案的细微差别.但是,没有一个答案试图给出全面的解释(因为这是一项艰巨的任务)
从我的谷歌搜索中查看一些示例
pd.DataFrame.pivot因此,每当有人搜索时,pivot他们会得到零星的结果,而这些结果可能无法回答他们的具体问题.
您可能会注意到,我明显地将我的列和相关列值命名为与我将如何在下面的答案中进行调整相对应.请注意,以便熟悉哪些列名称可以从哪里获得您正在寻找的结果.
import numpy as np
import pandas as pd
from numpy.core.defchararray import add
np.random.seed([3,1415])
n = 20
cols = np.array(['key', 'row', 'item', 'col'])
arr1 = (np.random.randint(5, size=(n, 4)) // [2, 1, 2, 1]).astype(str)
df = pd.DataFrame(
add(cols, arr1), columns=cols
).join(
pd.DataFrame(np.random.rand(n, 2).round(2)).add_prefix('val')
)
print(df)
key row item col val0 val1
0 key0 row3 item1 col3 0.81 0.04
1 key1 …Run Code Online (Sandbox Code Playgroud) 我有一个像熊猫一样的数据框:
a b
A 1
A 2
B 5
B 5
B 4
C 6
Run Code Online (Sandbox Code Playgroud)
我希望按第一列分组,并将第二列作为行中的列表:
A [1,2]
B [5,5,4]
C [6]
Run Code Online (Sandbox Code Playgroud)
使用pandas groupby可以做这样的事吗?
我希望我能为我的问题找到帮助.我正在寻找以下问题的解决方案:
我有一个dataFrame,如:
Sp Mt Value count
0 MM1 S1 a **3**
1 MM1 S1 n 2
2 MM1 S3 cb 5
3 MM2 S3 mk **8**
4 MM2 S4 bg **10**
5 MM2 S4 dgd 1
6 MM4 S2 rd 2
7 MM4 S2 cb 2
8 MM4 S2 uyi **7**
Run Code Online (Sandbox Code Playgroud)
我的目标是获取组之间计数最大的结果行,例如:
0 MM1 S1 a **3**
1 3 MM2 S3 mk **8**
4 MM2 S4 bg **10**
8 MM4 S2 uyi **7**
Run Code Online (Sandbox Code Playgroud)
有人知道我怎么能在熊猫或python中做到这一点?
UPDATE
我没有提供更多关于我的问题的细节.对于我的问题,我想按['Sp','Mt'分组.让我们举个第二个例子:
Sp Mt Value count …Run Code Online (Sandbox Code Playgroud) 我需要ID在每个domain
数据中计算唯一值
ID, domain
123, 'vk.com'
123, 'vk.com'
123, 'twitter.com'
456, 'vk.com'
456, 'facebook.com'
456, 'vk.com'
456, 'google.com'
789, 'twitter.com'
789, 'vk.com'
Run Code Online (Sandbox Code Playgroud)
我尝试df.groupby(['domain', 'ID']).count()
但我想得到
domain, count
vk.com 3
twitter.com 2
facebook.com 1
google.com 1
Run Code Online (Sandbox Code Playgroud) 如何通过密钥访问groupby对象中的相应groupby数据帧?使用以下groupby:
rand = np.random.RandomState(1)
df = pd.DataFrame({'A': ['foo', 'bar'] * 3,
'B': rand.randn(6),
'C': rand.randint(0, 20, 6)})
gb = df.groupby(['A'])
Run Code Online (Sandbox Code Playgroud)
我可以遍历它以获取密钥和组:
In [11]: for k, gp in gb:
print 'key=' + str(k)
print gp
key=bar
A B C
1 bar -0.611756 18
3 bar -1.072969 10
5 bar -2.301539 18
key=foo
A B C
0 foo 1.624345 5
2 foo -0.528172 11
4 foo 0.865408 14
Run Code Online (Sandbox Code Playgroud)
我希望能够做类似的事情
In [12]: gb['foo']
Out[12]:
A B C
0 foo 1.624345 5
2 foo …Run Code Online (Sandbox Code Playgroud) 给出以下(完全矫枉过正的)数据框示例
import pandas as pd
import datetime as dt
df = pd.DataFrame({
"date" : [dt.date(2012, x, 1) for x in range(1, 11)],
"returns" : 0.05 * np.random.randn(10),
"dummy" : np.repeat(1, 10)
})
Run Code Online (Sandbox Code Playgroud)
是否存在将两个不同的聚合函数应用于同一列的现有内置方法,而无需agg多次调用?
语法上错误但直观正确的方法是:
# Assume `function1` and `function2` are defined for aggregating.
df.groupby("dummy").agg({"returns":function1, "returns":function2})
Run Code Online (Sandbox Code Playgroud)
显然,Python不允许重复键.是否还有其他表达输入的方式agg?也许一个元组列表[(column, function)]会更好,允许多个函数应用于同一列?但它似乎只接受一本字典.
除了定义一个仅应用其中的两个函数的辅助函数之外,还有一个解决方法吗?(无论如何,它如何与聚合一起工作?)
考虑一个csv文件:
string,date,number
a string,2/5/11 9:16am,1.0
a string,3/5/11 10:44pm,2.0
a string,4/22/11 12:07pm,3.0
a string,4/22/11 12:10pm,4.0
a string,4/29/11 11:59am,1.0
a string,5/2/11 1:41pm,2.0
a string,5/2/11 2:02pm,3.0
a string,5/2/11 2:56pm,4.0
a string,5/2/11 3:00pm,5.0
a string,5/2/14 3:02pm,6.0
a string,5/2/14 3:18pm,7.0
Run Code Online (Sandbox Code Playgroud)
我可以阅读此内容,并将日期列重新格式化为datetime格式:
b=pd.read_csv('b.dat')
b['date']=pd.to_datetime(b['date'],format='%m/%d/%y %I:%M%p')
Run Code Online (Sandbox Code Playgroud)
我一直试图按月对数据进行分组.似乎应该有一种明显的方式来访问月份和分组.但我似乎无法做到这一点.有谁知道怎么样?
我目前正在尝试的是按日期重新编制索引:
b.index=b['date']
Run Code Online (Sandbox Code Playgroud)
我可以这样访问这个月:
b.index.month
Run Code Online (Sandbox Code Playgroud)
但是,我似乎无法找到一个按月累计的功能.
我有一个包含三个字符串列的数据框.我知道第3列中唯一的一个值对前两个的每个组合都有效.要清理数据,我必须按数据框前两列进行分组,并为每个组合选择第三列的最常见值.
我的代码:
import pandas as pd
from scipy import stats
source = pd.DataFrame({'Country' : ['USA', 'USA', 'Russia','USA'],
'City' : ['New-York', 'New-York', 'Sankt-Petersburg', 'New-York'],
'Short name' : ['NY','New','Spb','NY']})
print source.groupby(['Country','City']).agg(lambda x: stats.mode(x['Short name'])[0])
Run Code Online (Sandbox Code Playgroud)
最后一行代码不起作用,它说"键错误'短名称'",如果我尝试仅按城市分组,那么我得到一个AssertionError.我该怎么办呢?