1) Gerekli yaklaşım:
Daha hızlı bir uygulama buna göre buna dayalı sütunları dataframe değerlerini sıralamak ve hizalamak olacaktır np.argsort
sonra indeksleri elde ediyor.
df.columns[np.argsort(df.values)]
Out[156]:
Index([['a1', 'a2', 'a3', 'a4'], ['a3', 'a1', 'a2', 'a4'],
['a4', 'a2', 'a3', 'a1']],
dtype='object')
2) Yavaş genelleştirilmiş yaklaşımın:
pd.DataFrame(df.columns[np.argsort(df.values)], df.index, np.unique(df.values))
np.argsort
uygulanması bize aradığımız veriyi verirBazı hız/verimlilik pahasına daha genelleştirilmiş yaklaşım, dict
veri çerçevesinde bulunan dizeleri/değerleri, ilgili sütun adlarıyla eşleştirdikten sonra apply
kullanmak olacaktır.
Elde edilen seriyi list
gösterimlerine dönüştürdükten sonra bir veri çerçeve yapıcısı kullanın.
pd.DataFrame(df.apply(lambda s: dict(zip(pd.Series(s), pd.Series(s).index)), 1).tolist())
3) hızlı genel yaklaşım:
+ orient='records'
df.to_dict
gelen sözlük bir listesini elde edildikten sonra, içinde bunların yineleme sırasında, ilişkili oldukları anahtar ve değer çiftleri değiş tokuş etmek için ihtiyaç bir döngü.
pd.DataFrame([{val:key for key, val in d.items()} for d in df.to_dict('r')])
Örnek test durumda:
df = df.assign(a5=['Foo', 'Bar', 'Baz'])
Bu iki yaklaşım üretmek:
@piRSquared DÜZENLEME
genelleştirilmiş çözüm
def nic(df):
v = df.values
n, m = v.shape
u, inv = np.unique(v, return_inverse=1)
i = df.index.values
c = df.columns.values
r = np.empty((n, len(u)), dtype=c.dtype)
r[i.repeat(m), inv] = np.tile(c, n)
return pd.DataFrame(r, i, u)
ben merkezli gerçekten hızlı ve yaygın Numpy hazırlamakla piRSquared @ kullanıcıyı teşekkür etmek istiyorum alternatif soln.
için teşekkür ederiz, bunun yalnızca her şeyin düzgün bir şekilde temsil edildiği özel koşullar altında çalıştığını unutmayın. Bu harika bir cevap, sadece işaret ediyorum – piRSquared
Teşekkürler. Sanırım OP, bu mesajın dibinde durumdan bahsetmişti. Aksi takdirde, tüm sütunlar eşit olarak temsil edilmediyse, sanırım bu başarısız olur. –
Bu anlamlı geliyor – piRSquared