मेरे पास एक टेबल है जिसमें 200 से अधिक कॉलम हैं। कॉलम अलग-अलग जोड़े के साथ आते हैं (जैसे, दो प्रकार के बेंज), नीचे एक उदाहरण है। मैं जो करना चाहता हूं वह एक नए कॉलम के लिए प्रत्येक जोड़ी के अंतर की गणना करना है (उदाहरण के रूप में अंतिम कॉलम की तरह)। मैं पहले अक्षर के अनुसार तालिकाओं को दो तालिकाओं (ए और बी) से अलग करने और कॉलम को सॉर्ट करने के बारे में सोच रहा था। लेकिन क्या पंडों में अधिक कुशल तरीका है? धन्यवाद!

A_Benz  B_Benz  A_Audi  B_Audi  A_Honda B_Honda dif_Audi
1   0   1   1   0   0   0
1   0   0   1   0   0   -1
1   0   0   1   0   0   -1
1   0   1   1   1   1   0
1   0   0   1   0   0   -1
4
Alex Xu 28 मार्च 2018, 04:55

1 उत्तर

सबसे बढ़िया उत्तर

मान लें कि यह आपका शुरुआती बिंदु है -

df
   A_Benz  B_Benz  A_Audi  B_Audi  A_Honda  B_Honda
1       1       0       1       1        0        0
2       1       0       0       1        0        0
3       1       0       0       1        0        0
4       1       0       1       1        1        1
5       1       0       0       1        0        0

विकल्प 1
यह filter के लिए एक अच्छा उपयोग मामला होगा:

i = df.filter(regex='^A_*')
j = df.filter(regex='^B_*')

i.columns = i.columns.str.split('_', 1).str[-1]
j.columns = j.columns.str.split('_', 1).str[-1]

(i - j).add_prefix('diff_')

   diff_Benz  diff_Audi  diff_Honda
1          1          0           0
2          1         -1           0
3          1         -1           0
4          1          0           0
5          1         -1           0

यदि आप इसे वापस मूल डेटाफ़्रेम में जोड़ना चाहते हैं, तो आप concat का उपयोग करेंगे

df = pd.concat([df, (i - j).add_prefix('diff_')], axis=1)

विकल्प 2
diff का उपयोग करने वाला एक विकल्प; यह बहुत सारे अनावश्यक घटाव करता है:

import re

# if needed, order the columns correctly
df = df[sorted(df.columns, key=lambda x: x.split('_', 1)[1])]
# compute consecutive column differences
df.diff(-1, axis=1).iloc[:, ::2].rename(columns=lambda x: re.sub('A_', 'diff_', x))

   diff_Benz  diff_Audi  diff_Honda
1        1.0        0.0         0.0
2        1.0       -1.0         0.0
3        1.0       -1.0         0.0
4        1.0        0.0         0.0
5        1.0       -1.0         0.0

इसका एक अधिक प्रदर्शन करने वाला संस्करण होगा (@ jpp की विधि के समान) -

c = sorted(df.columns, key=lambda x: x.split('_', 1)[1])
df = df[c]

pd.DataFrame(
    df.iloc[:, ::2].values - df.iloc[:, 1::2].values, columns=c[::2]
)

   A_Audi  A_Benz  A_Honda
0       0       1        0
1      -1       1        0
2      -1       1        0
3       0       1        0
4      -1       1        0
4
cs95 28 मार्च 2018, 02:38