gpt4 book ai didi

python - 合并两列,Python + Pandas

转载 作者:太空狗 更新时间:2023-10-30 02:41:18 24 4
gpt4 key购买 nike

我有一个 df 安排如下:

   x    y    z
0 a jj Nan
1 b ii mm
2 c kk nn
3 d ii NaN
4 e Nan oo
5 f jj mm
6 g Nan nn

期望的输出是:

   x    y    z   w
0 a jj Nan a
1 b ii mm a
2 c kk nn c
3 d ii NaN a
4 e Nan oo e
5 f jj mm a
6 g Nan nn c

逻辑是

  1. 采用 y 和 z 列的并集:ii == jj 因为在索引 1 和 5 中,它们在 z 列中都有 mm

  2. group this union : index 0,1,3,5 是一个组,index 2,6 是另一个组

  3. 在组内,随机取一个x列的单元格,分配给整个组的w列

我对这个问题一无所知。有人可以帮助我吗?

编辑注意:

我首先发布了一个完美排序的列 y 和列 z,如下所示:

   x    y    z   w
0 a ii NaN a
1 b ii mm a
2 c jj mm a
3 d jj Nan a
4 e kk nn e
5 f Nan nn e
6 g Nan oo g

对于这种情况,piRSquared 的解决方案非常有效。

编辑说明2:

Nickil Maveli 的解决方案非常适合我的问题。但是,我注意到有一种情况解决方案无法处理,即:

   x   y   z
0 a ii mm
1 b ii nn
2 c jj nn
3 d jj oo
4 e kk oo

Nickil Maveli 的解决方案,结果如下:

   0   1   2  w
0 a ii mm a
1 b ii mm a
2 c jj nn c
3 d jj nn c
4 e kk oo e

但是,所需的输出应该是 w = ['a', 'a', 'a', 'a', 'a']。

最佳答案

在一般情况下,这是集合合并/连通分量问题。虽然如果我们对您的数据做出某些假设,我们可以解决一个简化的案例,但完成整个事情只是一些记账工作。

scipy 有一个连通分量函数,如果我们做一些准备就可以使用:

import scipy.sparse

def via_cc(df_in):
df = df_in.copy()

# work with ranked version
dfr = df[["y","z"]].rank(method='dense')
# give nans their own temporary rank
dfr = dfr.fillna(dfr.max().fillna(0) + dfr.isnull().cumsum(axis=0))
# don't let y and z get mixed up; have separate nodes per column
dfr["z"] += dfr["y"].max()

# build the adjacency matrix
size = int(dfr.max().max()) + 1
m = scipy.sparse.coo_matrix(([1]*len(dfr), (dfr.y, dfr.z)),
(size, size))

# do the work to find the groups
_, cc = scipy.sparse.csgraph.connected_components(m)

# get the group codes
group = pd.Series(cc[dfr["y"].astype(int).values], index=dfr.index)
# fill in w from x appropriately
df["w"] = df["x"].groupby(group).transform(min)

return df

这给了我

In [230]: via_cc(df0)
Out[230]:
x y z w
0 a jj NaN a
1 b ii mm a
2 c kk nn c
3 d ii NaN a
4 e NaN oo e
5 f jj mm a
6 g NaN nn c

In [231]: via_cc(df1)
Out[231]:
x y z w
0 a ii mm a
1 b ii nn a
2 c jj nn a
3 d jj oo a
4 e kk oo a

如果你有一套合并方案,比如 here ,您可以以外部函数为代价简化上面的一些内容。

(另外:请注意,在我的 df0 中,“Nan”实际上是 NaN。如果您有一个字符串“Nan”(请注意它与 NaN 有何不同),那么代码会认为它只是另一个字符串,假设您希望所有“Nan”都在同一组中。)

关于python - 合并两列,Python + Pandas,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39798594/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com