我的数据看起来像这样:
object weight
table 2.3
chair 1.2
chair 1.0
table 1.5
drawer 1.8
table 1.7
我想根据objects
的不同类型对数据进行分组。另外,我想知道我有多少物品和重物。
例如,我的最终数据应如下所示:
object counter weight
table 3 2.3, 1.5, 1.7
chair 2 1.2, 1.0
drawer 1 1.8
这是我的尝试:
data = pd.read_csv('data.dat', sep = '\s+')
grouped_data = {'object':[],'counter':[], 'weight':[]}
objects = ['table', 'chair', 'drawer']
for item in objects:
counter = 0
weight = []
grouped_objects['object'].append(item)
for i in range(len(data)):
if item == data['name'][i]:
counter += 1
grouped_data['weight'].append(data['weight'])
grouped_data['counter'].append(counter)
它没有给我所需的输出。有什么建议吗?
答案 0 :(得分:4)
使用agg:
df.groupby("object")["weight"].agg({"counter": "count", "weight": lambda x: ", ".join(x.astype(str))})
Out[57]:
counter weight
object
chair 2 1.2, 1.0
drawer 1 1.8
table 3 2.3, 1.5, 1.7
答案 1 :(得分:2)
您可以使用agg
并传递函数列表以这种方式执行此操作:
In [32]:
def counter(x):
return len(x)
def weight(x):
return ', '.join(x)
df.groupby('object')['weight'].agg([weight, counter]).reset_index()
Out[32]:
object weight counter
0 chair 1.2, 1.0 2
1 drawer 1.8 1
2 table 2.3, 1.5, 1.7 3
这假设weight
列dtype
已经str
,如果没有,那么转换为df['weight'] = df['weight'].astype(str)
答案 2 :(得分:2)
我认为你真正想要的是defaultdict
(它是集合库中的一个类),其默认函数返回一个空列表。然后,该列表的len
将为您提供计数器。例如:
from collections import defaultdict
grouped_data = defaultdict(list)
for i in range(data):
name, weight = data['name'][i], data['weight'][i]
grouped_data[name].append(weight)
print len(grouped_data['table']) #should return count of weights
答案 3 :(得分:0)
您可以使用len()
获取统计数,然后您可以使用for item in data
直接迭代数据,而不是使用range
获取索引:
data = [
{ 'name': 'table', 'weight': 2.3 },
{ 'name': 'chair', 'weight': 1.2 },
{ 'name': 'chair', 'weight': 1.0 },
{ 'name': 'table', 'weight': 1.5 },
{ 'name': 'drawer', 'weight': 1.8 },
{ 'name': 'table', 'weight': 1.7 }
]
grouped_data = {'table': [], 'chair': [], 'drawer': []}
for item in data:
grouped_data[item['name']].append(item['weight'])
print(grouped_data)
print(len(grouped_data['table']))
>>> {'table': [2.3, 1.5, 1.7], 'chair': [1.2, 1.0], 'drawer': [1.8]}
>>> 3
答案 4 :(得分:0)
一眼就能发现一些潜在的错误:
len(data)
不会为您提供数据中的行数,但会显示列数。请尝试使用data.shape[1]
代替。无论如何我会以不同的方式做,但也使用字典。有意义的是,字典中每个条目的键将是对象的类型,值将是您要存储的数据。例如,{'table': {'counter':3, weight: [2.3, 1.5, 1.7]}}
现在,您只需遍历数据,填写字典,然后以您想要的任何格式打印它。这种方法也应该更有效率(n而不是n ^ 2):
data = pd.read_csv('data.dat', sep = '\s+')
# creating initial empty dictionary
info = {
'table': {'counter':0,'weight':[]}
'chair': {'counter':0,'weight':[]}
'drawer': {'counter':0,'weight':[]}
} # you can also create it using a loop
# filling dictionary with values
for i in range(data.shape[1]):
cur_dict = info[data['name'][i]]
cur_dict['counter'] += 1
cur_dict['weight'].append(data['weight'][i])
# printing in desired format
print 'object\tcounter\tweight'
for key in info:
cur = info[key]
print key + '\t' + str(cur['counter']) + '\t' + repr(cur['weight'])
希望它适合你:)
答案 5 :(得分:0)
您可以将groupby与字典理解结合使用。
>>> pd.DataFrame({col: [len(group), group.loc[:, 'weight'].tolist()]
for col, group in df.groupby('object')}).T.rename(columns={0: 'count',
1: 'weights'})
count weights
chair 2 [1.2, 1.0]
drawer 1 [1.8]
table 3 [2.3, 1.5, 1.7]