我的数据框:
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。
我可以使用哪种方法解决此问题? 任何建议将不胜感激。
答案 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的groupby
和apply
可以节省大量时间并避免输入数据上的嵌套循环(尽管我敢肯定还有一种更快的方法可以避免使用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