使用csv中的条件更新一列中的值

2024-10-01 09:24:35 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个csv文件,其中有列位置和数量(Menge)。我必须添加行的副本,其中(在我的情况下,它是Menge)Quantity>;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 loop和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和熊猫还很陌生。你知道吗

所以我修改了我的问题。我有不同的产品,但其中一些有相同的位置。我怎样才能改变每一个产品的位置,而不是像所有产品都是一个一样添加产品.as如表所示


Tags: 文件csvto数量index产品checkcounter
2条回答

你可以这样做:

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

所以这里Igroupby'Position'上,用param method='first'调用^{},使相等的值按照出现的顺序排列,这有效地按照与计数器相同的顺序排列值

您的错误来自:

counter=selected['Menge']

然后使用以下方法进行比较:

while counter>=1:

所以这个错误告诉你它不知道如何解释一个Series,因为counter >=返回一个布尔序列,它需要一个标量布尔值来解释。您必须逐行迭代,这样才能得到一个标量值,以便正确地解释,此外,您应该尽可能避免循环,因为它很慢

编辑

根据您的新数据,您只需在多个列上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

import pandas as pd
df = pd.DataFrame({'Position':[200,200,200,400,400,400,400,400,400,400],'Menge':[3,3,3,7,7,7,7,7,7,7]})

for pos in df.Position.unique():    
    counter = 0.1
    for idx,row in df.iterrows():        
        if row['Position'] == pos:
            df.at[idx,'Position_1'] = df.at[idx,'Position']+counter
            counter+=0.1

df.drop(['Position'],axis=1,inplace=True)   
df.columns = ['Menge','Position']

输出:

print(df)



  Menge Position
0   3      200.1
1   3      200.2
2   3      200.3
3   7      400.1
4   7      400.2
5   7      400.3
6   7      400.4
7   7      400.5
8   7      400.6
9   7      400.7

相关问题 更多 >