![](/img/trans.png)
[英]Remove rows from pandas dataframe based on multiple columns with similar values
[英]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.