2017-08-02 8 views
6

मान लीजिए कि मैं मानों की सूची करते हैं,एक अपूर्ण पांडस डेटाफ्रेम को कुशलता से भरने के लिए कैसे सूची में मूल्यों के जोड़ों के संयोजन शामिल हैं?

lst=['orange','apple','banana', 'grape', 'lemon'] 

मैं भी रूप के एक पांडा dataframe है, df:

Source  Destination  Weight 
orange  apple   0.4 
banana  orange   0.67 
grape  lemon   0.1 
grape  banana   0.5 

पंक्तियों lst में सभी जोड़ो संयोजन की एक सबसेट हैं। ध्यान दें कि प्रत्येक संयोजन सबसे अधिक बार प्रकट होता है।

Source  Destination  Weight 
orange  apple   0.4 
banana  orange   0.67 
grape  lemon   0.1 
grape  banana   0.5 
orange  grape   0.0 
orange  lemon   0.0 
banana  lemon   0.0 

आदेश एक फर्क नहीं करता है:

मैं क्या चाहता हूँ एक नया dataframe जहां शेष संयोजन 0.

उदाहरण के लिए, new_df के एक मूल्य के साथ में भर रहे हैं है।

ऐसा करने का तेज़ तरीका क्या है?

उत्तर

5
  • मैं संयोजन के सेट की एक सरणी
  • तब मैं करते संयोजन पहले से ही मौजूद है कि
  • मैं np.in1d का उपयोग लोगों को खोजने के लिए एक ही बात है कि अस्तित्व में नहीं है
  • फिर एक संलग्न बनाने उन लोगों के साथ नया डेटाफ्रेम जो अभी तक मौजूद नहीं है।

from itertools import combinations 

comb = np.array([set(x) for x in combinations(lst, 2)]) 
exst = df[['Source', 'Destination']].apply(set, 1).values 
new = comb[~np.in1d(comb, exst)] 

d1 = pd.DataFrame(
    [list(x) for x in new], 
    columns=['Source', 'Destination'] 
).assign(Weight=0.) 

df.append(d1, ignore_index=True) 

    Source Destination Weight 
0 orange  apple 0.40 
1 banana  orange 0.67 
2 grape  lemon 0.10 
3 grape  banana 0.50 
4 grape  orange 0.00 
5 orange  lemon 0.00 
6 apple  banana 0.00 
7 grape  apple 0.00 
8 apple  lemon 0.00 
9 banana  lemon 0.00 
+0

हो सकता है, मैं जाकर जहां मेरे मस्तिष्क मुझे ले जाता है को वापस लाएं। एक जवाब प्राप्त करें और अधिक खोजें ... अब देख रहे हैं (-: – piRSquared

+0

उत्तर के लिए धन्यवाद! मुझे लगता है कि हमें ऐसा करके डुप्लिकेट मिलते हैं। उदाहरण के लिए, केले/नारंगी का 0.67 का मान था, लेकिन एक और पंक्ति- नारंगी/केले को 0.0 के मान के साथ जोड़ा जाता है। क्या उन पंक्तियों को जोड़ने का कोई तरीका नहीं है? – Melsauce

+0

@Melsauce मैंने इसके बारे में भी सोचा नहीं था ... मुझे कुछ अलग करना होगा या कुछ अलग करना होगा। कुछ मिनट। – piRSquared

2

चरण 1: एक frozenset करने के लिए अपने स्रोत dataframe कन्वर्ट

In [350]: df = df.assign(Combinations=df.apply(lambda x: frozenset(x[:-1]), axis=1)).loc[:, ['Combinations', 'Weight']] 

चरण 2: lst

In [352]: new_df = pd.DataFrame(list(itertools.combinations(lst, 2)), columns=['Source', 'Destination']) 
से वस्तुओं के सभी संभव संयोजनों ( import itertools पहले) उत्पन्न

चरण 3: संयोजनों पर विलय करें

In [358]: new_df = new_df.iloc[:, :2].apply(lambda x: frozenset(x), axis=1)\ 
         .to_frame().rename(columns={0 : "Combinations"})\ 
         .merge(df, how='outer').fillna(0) 

चरण 4: मूल संरचना

In [365]: new_df.apply(lambda x: pd.Series(list(x['Combinations'])), axis=1)\ 
       .rename(columns={0 : 'Source', 1 : 'Destination'})\ 
       .join(new_df['Weight']) 
Out[365]: 
    Source Destination Weight 
0 orange  apple 0.40 
1 orange  banana 0.67 
2 grape  orange 0.00 
3 orange  lemon 0.00 
4 apple  banana 0.00 
5 grape  apple 0.00 
6 apple  lemon 0.00 
7 grape  banana 0.50 
8 lemon  banana 0.00 
9 grape  lemon 0.10 
+0

अपडेट की है मेरी ही समस्या ... ओपी '(' नारंगी ',' सेब ')' और '(' सेब ',' नारंगी ')' – piRSquared

+0

@piRSquared के बीच उदासीनता चाहता है अभी कैसे? मुझे बुलेट काटने का काम करना पड़ा। यह वास्तव में लंबे समय तक हवादार है। –

+0

केले, नारंगी होने के साथ क्या हुआ .67 – piRSquared

संबंधित मुद्दे