繁体   English   中英

如何根据熊猫数据框中的相似行设置行的值?

[英]How to set the values of a row based on similar rows in pandas dataframe?

我有一个数据框,我想根据第一列中的重复值添加一列。这是我的数据框:

df
col1    col2   col3

data1    s1     k1
data1    s2     k2
data2    s4     k4
data2    s5     k5
data3    s6     k6
data3    s7     k7
data1    s8     k8
data1    s9     k9

我想要的输出是

col1    col2   col3  newcol

data1    s1     k1    10
data1    s2     k2    20
data2    s4     k4    10
data2    s5     k5    20
data3    s6     k6    10
data3    s7     k7    20
data1    s8     k8    30
data1    s9     k9    40

所以在第 7 行 data1 再次出现并且已经在第 2 行中,所以我将其设置为 30(增量为 10)。 我试过类似的东西

outputdf["code"] = [i for i in range(10,10+len(outputdf),10)]

但它不起作用,请帮助我如何实现输出。

db_df = made a dataframe from the database
col1    col2   col3  newcol

data1    s1     k1    30
data1    s2     k2    40
data2    s4     k4    10

在这个 db_df 中,我已经有了数据:col1(data1,data1,data2) of newcol(30,40,10),当我在 df 中创建 newcol 时,我希望 data1 变为 40+10 & data2 10+10( 40, 10 是 db_df 的 data1 和 data2 行中 newcol 的最大值)。 我想将 df 与 db_df 进行比较,如果 db_df 中不存在 data1,则创建 data1 行 10/20...否则现有的最大 newcol 值 + 10,例如:如果 db_df 存在,则 out 应该是

col1    col2   col3  newcol

data1    s1     k1    50 
data1    s2     k2    60 
data2    s4     k4    20
data2    s5     k5    30
data3    s6     k6    10
data3    s7     k7    20
data1    s8     k8    70
data1    s9     k9    80

现在发生的事情是,它不检查 db_df 中是否存在 data1 或 data2,所以不是 Row(data1,data1,data2,data2 -- 50,60,20,30) 我得到的是 Row(data1,data1,数据2,数据2 -- 10,20,10,20)

my output after edit code is
0  data1   s1   k1      40
1  data1   s2   k2      50
2  data2   s4   k4      20
3  data2   s5   k5      30
4  data3   s6   k6      10
5  data3   s7   k7      20
6  data1   s8   k8      60
7  data1   s9   k9      70

期待这个

data1    s1     k1    50 
data1    s2     k2    60 
data2    s4     k4    20
data2    s5     k5    30
data3    s6     k6    10
data3    s7     k7    20
data1    s8     k8    70
data1    s9     k9    80

.transform('first')返回第一个非 NaN 值,我想从 db_df 中 'newcol' 的最大值开始计数,无论如何,我试过 df['newcol'] = (df.groupby('col1 ')['newcol'].transform(max) + (df.groupby('col1').cumcount()+ 1) * 10) 但不起作用。

行 data1 的 newcol 的最大值是 40 & data2 是 10 ,所以我想从 50 开始 data1 & 20 开始 data2

1 最后的帮助,这仅在第一个数据帧的(df)col2 和 col3 值与第二个数据帧的(db_df)col2 和 col3 相同时才有效,如果我将 df_df 的 col2 和 col3 的值更改为其他值,我认为它不起作用? 请看一看

when db_df = 
col1 col2 col3 newcol
0  data1   m1   n1     20
1  data1   m2   n2     90
2  data2   m4   m4     50

那么它不会使用 .transform(max) 给出输出。 只有当 DataFrame 的 col2 和 col3 列中的每一行都具有相同的值时,它才有效吗? 请核实

使用groupby (在第一列上)+ cumcount ,加 1(因为我们从零开始计数),然后乘以 10:

df['newcol'] = (df.groupby('col1').cumcount() + 1) * 10

    col1 col2 col3  newcol
0  data1   s1   k1      10
1  data1   s2   k2      20
2  data2   s4   k4      10
3  data2   s5   k5      20
4  data3   s6   k6      10
5  data3   s7   k7      20
6  data1   s8   k8      30
7  data1   s9   k9      40

编辑(问题更新后)。 您必须合并原始数据库数据帧,以便您知道从哪里开始计数(df.groupby('col1')['newcol'].transform('first')然后将其添加到我的第一个解决方案中:

df = df.merge(db_df, on=['col1', 'col2', 'col3'], how='left')
df['newcol'] = df['newcol'].fillna(0).astype(int)
df['newcol'] = (df.groupby('col1')['newcol'].transform('max') 
             + (df.groupby('col1').cumcount()+ 1) * 10)
df

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM