如何为每个类别添加多个级别

时间:2019-12-03 21:39:18

标签: python pandas

例如,我在“位置”列下有多个位置,那么我想在每个位置内添加组号。但是,地点的组数不同。

例如df1

Location
Chicago
Minneapolis
Dallas
.
.
.

和df2

Location      times
Chicago         2
Minneapolis     5
Dallas          1
.               .
.               .
.               .

我想要得到的是:

Location   Group
Chicago      1
Chicago      2
Minneapolis  1
Minneapolis  2
Minneapolis  3
Minneapolis  4
Minneapolis  5
Dallas       1
.
.
.

我现在拥有的是...在位置之间重复相同数量的组:每个位置内有17个组。但是我只是意识到地点之间会有不同的群体...然后我不知道下一步该怎么做。

filled_results['location'] = results['location'].unique()
filled_results['times'] = 17
filled_results = filled_results.loc[filled_results.index.repeat(filled_results.times)]

v = pd.Series(range(1, 18))
filled_results['group'] = np.tile(v, len(filled_results) // len(v) + 1)[:len(filled_results)]  

filled_results = filled_results.drop(columns=['times'])

我当时在考虑for循环,但不知道如何实现。对于df1中的每个唯一位置,根据df2中的#ofgroups将其0分配给x的组。

2 个答案:

答案 0 :(得分:1)

我想自己找到了解决方案。如果将此视为每个组中的添加索引,则非常容易。解决方法如下:

df = pd.DataFrame()
df['location'] = df1['location'].unique()
df = pd.merge(df,
              df2,
              on = 'location',
              how = 'left' )
df = df.loc[df.index.repeat(df.times)]

df["Group"] = df.groupby("location")["times"].rank(method="first", ascending=True)

df["Group"] = df["Group"].astype(int)
df = df.drop(columns=['times'])

答案 1 :(得分:0)

您可以查看此代码。

data = [
  { 'name': 'Chicago', 'c': 2 },
  { 'name': 'Minneapolis', 'c': 5 },
  { 'name': 'Dallas', 'c': 1 }
]

result = []

for location in data:
  for i in range(0, location['c']):
    result.append({ 'name': location['name'], 'group': i+1 })

result将是:

[{'group': 1, 'name': 'Chicago'}, {'group': 2, 'name': 'Chicago'}, {'group': 1, 'name': 'Minneapolis'}, {'group': 2, 'name': 'Minneapolis'}, {'group': 3, 'name': 'Minneapolis'}, {'group': 4, 'name': 'Minneapolis'}, {'group': 5, 'name': 'Minneapolis'}, {'group': 1, 'name': 'Dallas'}]