私は次のように配置された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
論理は
列yとzの和集合を取る:ii == jj
インデックス1と5では、両方ともmm
列zにあるため
このユニオンをグループ化する:インデックス0、1、3、5はグループ、インデックス2、6は別のグループ
グループ内で、列xの1つのセルをランダムに取得し、グループ全体の列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のソリューションは完璧に機能します。
EDITNOTE2:
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
ここにあるような設定された統合レシピがある場合は、外部関数を犠牲にして上記のいくつかを単純化できます。
(余談ですが、私のdf0では、「Nan」は実際にはNaNです。文字列「Nan」がある場合(NaNとの違いに注意してください)、コードはそれが単なる別の文字列であると見なし、必要なものと見なします。すべての「ナン」は同じグループに属します。)
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加