字典中的组数据

时间:2016-05-02 15:47:25

标签: python dictionary pandas

我的数据看起来像这样:

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)

它没有给我所需的输出。有什么建议吗?

6 个答案:

答案 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

这假设weightdtype已经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]