python - 使用 pandas 根据 csv 中另一列中的条件更新一列中的值

标签 python pandas csv

我有一个 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/

相关文章:

python - 使用 pandas 对多个 csv 文件的数据求和

Python 格式和 Pandas

python - 跟踪进程及其子进程的 CPU 使用率

python - 给定源代码,如何使用 CFFI 调用现有的 C 函数?

python - 为什么 Python float 有 real 和 imag 属性?

python - 查找两列中的所有重复值并生成一个不同的行

python - Pandas - 访问对象属性列的快速方法

javascript - 导出到 CSV 文件分隔符问题

php - 在 PHP 中连接数组(如 MySQL 连接)

python - 在 Python 中分割具有不同位置标记的文件的更好方法