如何使用python在数据框内拆分值

时间:2018-09-22 19:07:41

标签: python pandas

我的数据框:

df
Object      quantity
A             3
B             4
C             10
D             11

我想要的结果:

df
Object      quantity
A             3
B             4
C             4
C             4
C             2
D             4
D             4
D             3

我的目标是将存储在column2“数量”中的值分割为4或小于4。

我可以使用哪种方法解决此问题? 任何建议将不胜感激。

3 个答案:

答案 0 :(得分:1)

这可行,但就熊猫而言,它既不美观也不快速:

df = pd.DataFrame({'idx': ['A', 'B', 'C', 'D', 'E', 'F', 'G'],
                   'quantity': [1., 2., 3., 4., 5., 6., 7.]})

df['factor'] = df.quantity // 4.
df['modulo'] = df.quantity % 4.

res = pd.DataFrame({'idx': [], 'quantity': []})

for idx, row in df.iterrows():
    for idxx in range(int(row.factor)):
        res = res.append({'idx': row.idx, 'quantity': 4.},
                         ignore_index=True)
    if row.modulo > 0:
        res = res.append({'idx': row.idx, 'quantity': row.modulo},
                         ignore_index=True)

In [24]: df
Out[24]: 
  idx  quantity
0   A       1.0
1   B       2.0
2   C       3.0
3   D       4.0
4   E       5.0
5   F       6.0
6   G       7.0

In [22]: res
Out[22]: 
  idx  quantity
0   A       1.0
1   B       2.0
2   C       3.0
3   D       4.0
4   E       4.0
5   E       1.0
6   F       4.0
7   F       2.0
8   G       4.0
9   G       3.0

答案 1 :(得分:1)

类似的事情可能起作用。对于数量大于4的每个组,应用一个函数进行行拆分并存储到临时数据帧中,然后将所有内容组合在一起以获得所需的输出:

df = pd.DataFrame({'idx': ['A', 'B', 'C', 'D'],
                   'quantity': [3, 4, 10, 11]})

def split_quant(df):
    quantities = ([4]*(df['quantity'].iat[0] // 4)) + [df['quantity'].iat[0] % 4]

    temp = pd.DataFrame({'idx': df['idx'].iat[0],
                         'quantity': quantities
                         }, index=range(len(quantities)))
    temp = temp[temp['quantity']!=0]

    return temp

df_split = df[df['quantity'] > 4].groupby('idx').apply(split_quant)

output = df[df['quantity'] <= 4].append(df_split).reset_index(drop=True)

writer = pd.ExcelWriter('output.xlsx')
output.to_excel(writer, 'Sheet1', index=False)
writer.save()

以上内容将为您提供以下输出数据框:

  idx  quantity
0   A         3
1   B         4
2   C         4
3   C         4
4   C         2
5   D         4
6   D         4
7   D         3

编辑:

我自由地对各种方法进行了一些时序测试。使用Pandas的groupbyapply可以节省大量时间并避免输入数据上的嵌套循环(尽管我敢肯定还有一种更快的方法可以避免使用apply ...)

我的:

5.49 ms ± 240 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

@Iqbal Basyar:

22.8 ms ± 1.47 ms per loop (mean ± std. dev. of 7 runs, 100 loops each)

@sobek

17.7 ms ± 922 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

答案 2 :(得分:1)

很遗憾,Pandas不支持此功能。因此,您必须基于旧数据框创建一个新数据框。

对于旧数据框中的每个项目,计算

old_quantity = n * 4 + rest_quantitity

因此,在新的数据框中,您将添加数量为4的 n 个项目,再加上一个数量为rest_quantity的项目(如果rest_quantity不为零)

df = df = pd.DataFrame({'item': ["A","B","C"], 'qty': [3, 8,11]})
new_df = pd.DataFrame({'Item': [], 'qty': []})

for idx, item in df.iterrows():    
  if item['qty'] > 4 :
      n = item['qty'] // 4
      r = item['qty'] % 4 
      for _ in range(n):
          new_df.loc[len(new_df)] = [item['item'], 4]
      if r > 0 :
          new_df.loc[len(new_df)] = [item['item'], r]
  else :
      new_df.loc[len(new_df)] = [item['item'], item['qty']]

df

    item qty
0   A   3
1   B   8
2   C   11

new_df

   Item qty
0   A   3.0
1   B   4.0
2   B   4.0
3   C   4.0
4   C   4.0
5   C   3.0