numpy 用Pandas矩阵的不相等子集替换行

ddrv8njm  于 12个月前  发布在  其他
关注(0)|答案(1)|浏览(113)

假设我有一个数组(df 1),
| ID|仅限客户|市|状态|
| --|--|--|--|
| 1 |N| 0 | 0 |
| 1 |Y| 0 | 0 |
| 1 | 0 |一|B|
| 2 |N| 0 | 0 |
| 2 |Y| 0 | 0 |
| 2 | 0 |C| D|
| 2 | 0 |E| F|
| 3 |N| 0 | 0 |
| 3 |Y| 0 | 0 |
| 3 | 0 |G| H|
预期产出如下。
| ID|仅限客户|市|状态|
| --|--|--|--|
| 1 |N|一|B|
| 1 |Y|一|B|
| 2 |N| C| D|
| 2 |N| E| F|
| 2 |Y| C| D|
| 2 |Y| E| F|
| 3 |N| G| H|
| 3 |Y| G| H|
这是我的代码。
1.用np.NaN填充州和城市列

data = {
    "ID": [1,1,1,2,2,2,2,3,3,3],
    "customer_only": ['N','Y',0,'N','Y',0,0,'N','Y',0],
    "city": [0,0,'A',0,0,'C','E',0,0,'G'],
    "state": [0,0,'B',0,0,'D','F',0,0,'H']}

df1 = pd.DataFrame(data)

df1[['city', 'state']] = df1[['city', 'state']].replace(0, np.NaN)

字符串
1.我使用bfill()在customer_only=0的行中用city和state的值填充前面的NaN(s)。

df1[['city', 'state']] = df1[['city', 'state']].bfill()


1.然而,对于ID=2,bfill()并没有给予预期的输出。我也使用了groupby(),但它不能重塑ID=2行的维度。
有什么建议吗?

bweufnob

bweufnob1#

您可以分别切片0/非0行,并merge

# identify non-0 rows (use the correct type)
m = df['customer_only'].ne(0)

# pick the non-0 rows, merge with the 0s on ID
out = (df.loc[m, ['ID', 'customer_only']]
       .merge(df.loc[~m, ['ID', 'city', 'state']], on='ID')
      )

字符串
输出量:

ID customer_only city state
0   1             N    A     B
1   1             Y    A     B
2   2             N    C     D
3   2             N    E     F
4   2             Y    C     D
5   2             Y    E     F
6   3             N    G     H
7   3             Y    G     H

相关问题