我有一个 csv 文件,其中有“位置”和“数量”列(Menge)。我必须添加行的副本(在我的例子中是 Menge)数量 >1,我使用以下方法做到了:
file_to_check = file_to_check.loc[file_to_check.index.repeat(file_to_check.Menge)].reset_index(drop=True)
这很好用,完全按照我想要的方式复制,但我还必须更新它们的位置。 例如:
Position Menge Product
200 3 a
200 3 a
200 3 a
400 7 b
400 7 b
400 7 b
400 7 b
400 7 b
400 7 b
400 7 b
200 4 c
200 4 c
200 4 c
200 4 c
我希望它看起来像这样
Position Menge Product
200.1 3 a
200.2 3 a
200.3 3 a
400.1 7 b
400.2 7 b
400.3 7 b
400.4 7 b
400.5 7 b
400.6 7 b
400.7 7 b
200.1 4 c
200.2 4 c
200.3 4 c
200.4 4 c
.
.
.
之后我知道我可以使用以下方法更改 Menge(数量):
selected.loc[:, 'Menge'] = 1
我尝试使用 for 循环和 loc 作为:
counter=0
if selected.loc[selected.Menge >1]:
counter=selected['Menge']
i=1
while counter>=1:
selected['Pos.']+=i/10
i+=1
counter-=1
但我不断收到错误:
'ValueError: The truth value of a DataFrame is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().'
我寻找答案,但没有什么能真正帮助我。因为我对 python 和 pandas 还很陌生,所以需要一些帮助。
所以我编辑了我的问题。我有不同的产品,但其中一些有相同的 Pos。 。我如何更改每个产品的 Pos。并且不要将它们视为一个产品来添加。如表中所示
最佳答案
你可以这样做:
In[75]:
df['Position'] = df['Position'] + df.groupby('Position')['Position'].rank(method='first')/10
df
Out[75]:
Position Menge
0 200.1 3
1 200.2 3
2 200.3 3
3 400.1 7
4 400.2 7
5 400.3 7
6 400.4 7
7 400.5 7
8 400.6 7
9 400.7 7
所以我在这里对'Position'
进行groupby
并调用rank
使用 param method='first'
以便相等的值按出现顺序排列,这可以有效地按与计数器相同的顺序对值进行排列
您的错误来自于此:
counter=selected['Menge']
然后使用以下方法进行比较:
while counter>=1:
因此错误告诉您它不明白如何解释 Series
作为 counter >=
返回一个 bool 系列,它需要一个标量 bool 值值来解释。您必须逐行迭代,以便获得标量值才能正确解释,此外,您应该尽可能避免循环,因为它很慢
编辑
根据您的新数据,您只需对多个列进行groupby
:
In[81]:
df['Position'] = df['Position'] + df.groupby(['Position','Menge'])['Position'].rank(method='first')/10
df
Out[81]:
Position Menge Product
0 200.1 3 a
1 200.2 3 a
2 200.3 3 a
3 400.1 7 b
4 400.2 7 b
5 400.3 7 b
6 400.4 7 b
7 400.5 7 b
8 400.6 7 b
9 400.7 7 b
10 200.1 4 c
11 200.2 4 c
12 200.3 4 c
编辑
好的,要处理出现次数超过 10 次的情况,以避免执行 201
操作:
In[98]:
df['Position'] = (df['Position'].astype(str) + '.' + df.groupby(['Position','Menge'])['Position'].rank(method='first').astype(int).astype(str)).astype(float)
df
Out[98]:
Position Menge Product
0 200.1 3 a
1 200.2 3 a
2 200.3 3 a
3 400.1 7 b
4 400.2 7 b
5 400.3 7 b
6 400.4 7 b
7 400.5 7 b
8 400.6 7 b
9 400.7 7 b
10 200.1 4 c
11 200.2 4 c
12 200.3 4 c
13 200.4 4 c
因此,这会首先将 rank
的输出转换为 int
,因为它会生成 float
,然后转换为 str
所以我们可以创建一个字符串,例如'200' + '.' + '1'
,然后在必要时转换回 float
关于python - 使用 pandas 根据 csv 中另一列中的条件更新一列中的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55627713/