字典中的分组数据

2024-06-16 14:33:29 发布

您现在位置:Python中文网/ 问答频道 /正文

我的数据如下所示:

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)

它没有给我想要的输出。有什么建议吗?你知道吗


Tags: 数据in类型fordataobjectsobjectcounter
3条回答

使用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

您可以通过使用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

这假定weightdtype已经是str如果不是,则通过执行df['weight'] = df['weight'].astype(str)进行转换

我认为您实际需要的是一个defaultdict(它是collections库中的一个类),其默认函数返回一个空列表。然后,该列表的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

相关问题 更多 >