如何解决Pandas:将列值复制到第二个数据帧中的行改写
重新表述一下,抱歉之前有点不清楚。
考虑这个数据:
import pandas as pd
d = {
"id": [1,1,2,3,3],"col_to_fill": [0,0]
}
df = pd.DataFrame(d)
df
id col_to_fill
0 1 0
1 1 0
2 1 0
3 1 0
4 1 0
5 2 0
6 2 0
7 2 0
8 2 0
9 2 0
10 3 0
11 3 0
12 3 0
13 3 0
14 3 0
d1 = {
"id": [1,"val1": [23,23,0],"val2": [42,44,9],"val3": [12,8,55],"val4": [2,88,21],"val5": [53,33]
}
df2 = pd.DataFrame(d1)
df2
id val1 val2 val3 val4 val5
1 23 42 12 2 53
2 23 44 8 88 2
3 0 9 55 21 33
4 0 9 55 21 33
..............
在 df 中,我的行的 ID 为每个唯一 ID 重复了 N 次(在这种情况下 N=5,但希望它在实际用例中为 21,或者任何可能的情况下工作)。
在 df2 中,我在第 1 列中具有相同的唯一 ID,以及一些列值(val1、val2 等)
目标:
- 我希望每个仪器的 df 中的每一行都有 val1、val2、val3、val4、val5。
对于 ID 1 和 2:
id col_to_fill
1 23
1 42
1 12
1 2
1 53
2 23
2 44
2 8
2 88
2 2
等等 ......
这行不通:
df2.melt(id_vars=['id'])
因为那样
id variable
1 val1
1 val1
1 val1
1 val1
1 val1
2 val2
2 val2
2 val2
2 val2
2 val2
我需要:
id variable
1 val1
1 val2
1 val3
1 val4
1 val5
2 val1
2 val2
2 val3
2 val4
2 val5
(当然除了实际值,但我想要那些变量的值)
解决方法
将 DataFrame.set_index
与 DataFrame.stack
一起使用:
df2 = df2.set_index('id').stack().rename_axis(['id','new']).reset_index().drop(0,axis=1)
print (df2)
id new
0 1 val1
1 1 val2
2 1 val3
3 1 val4
4 1 val5
5 2 val1
6 2 val2
7 2 val3
8 2 val4
9 2 val5
10 3 val1
11 3 val2
12 3 val3
13 3 val4
14 3 val5
然后如果需要添加到另一个具有不同大小的 DataFrame 可能使用 GroupBy.cumcount
和 DataFrame.merge
技巧:
d = {
"id": [1,1,2,3,3],"col_to_fill": [0,0]
}
df = pd.DataFrame(d)
df['g'] = df.groupby('id').cumcount()
df2['g'] = df2.groupby('id').cumcount()
df = df.merge(df2,on=['id','g'])
print (df)
id col_to_fill g new
0 1 0 0 val1
1 1 0 1 val2
2 1 0 2 val3
3 1 0 3 val4
4 2 0 0 val1
5 2 0 1 val2
6 2 0 2 val3
7 2 0 3 val4
8 3 0 0 val1
9 3 0 1 val2
10 3 0 2 val3
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。