मेरे पास एक बड़ा डेटाफ़्रेम a है जिसे मैं डेटाफ़्रेम b बनने के लिए विभाजित या विस्फोट करना चाहता हूं (असली डेटाफ़्रेम a में 90 कॉलम हैं)।

मैंने इस तरह की समस्या के समाधान की तलाश करने की कोशिश की लेकिन मुझे नहीं मिला क्योंकि यह कोशिकाओं में मूल्यों से संबंधित नहीं है बल्कि कॉलम नामों से संबंधित है।

समाधान के लिए या पांडा पुस्तकालय में किसी मौजूदा फ़ंक्शन का उपयोग करने के लिए किसी भी सूचक की सराहना की जाएगी।

पहले ही, आपका बहुत धन्यवाद।

from pandas import DataFrame
import numpy as np
# current df
a = DataFrame([{'ID': 'ID_1', 'A-1': 'a1', 'B-1':'b1','C-1':'c1', 'A-2': 'a2', 'B-2':'b2','C-2':'c2'}])

# desired df
b = DataFrame([{'ID': 'ID_1', 'A': 'a1', 'B':'b1', 'C':'c1'},
               {'ID': 'ID_1','A': 'a2', 'B':'b2','C':'c2'}])

वर्तमान डीएफ current df

वांछित डीएफ desired df

मेरे पास एक विचार है कि इस डेटाफ़्रेम को दो डेटाफ़्रेम में विभाजित करना है (डेटाफ़्रेम 1 में A1 से C1 तक के कॉलम होंगे और डेटाफ़्रेम 2 में A2 से C2 तक के कॉलम होंगे) कॉलम का नाम बदलकर A/B/C करें और दोनों को संयोजित करें। लेकिन मैं दक्षता के मामले में निश्चित नहीं हूं क्योंकि मेरे पास 90 कॉलम हैं जो समय के साथ बढ़ेंगे।

3
sel 26 जिंदा 2022, 20:00
क्या आपके पास बिल्कुल 90 कॉलम हैं? क्या आपके पास ए, बी, सी विविधताओं की संख्या समान है?
 – 
enke
26 जिंदा 2022, 20:18
अभी के लिए मेरे पास 90 कॉलम हैं जो भविष्य में इससे अधिक हो सकते हैं। नहीं, उदाहरण के लिए, मेरे पास A-1 से A-6 हो सकता है, लेकिन केवल D-1 से D-4 हो सकता है। इसके अलावा मेरे पास आईडी जैसे अन्य कॉलम हैं जिनमें कोई भिन्नता नहीं है लेकिन उदाहरण के लिए आईडी -1 की तरह ही हर पंक्ति में डुप्लिकेट करने की आवश्यकता है।
 – 
sel
26 जिंदा 2022, 20:23

4 जवाब

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

pd.wide_to_long कम संख्या में ज्ञात लोगों को मानकर यहां अच्छी तरह से काम करता है उपनाम:

b = (
    pd.wide_to_long(a, stubnames=['A', 'B', 'C'], sep='-', i='ID', j='to_drop')
        .droplevel(level='to_drop')
        .reset_index()
)

     ID   A   B   C
0  ID_1  a1  b1  c1
1  ID_1  a2  b2  c2

वैकल्पिक रूप से set_index, '-' पर कॉलम विभाजित करें str.split और ढेर:

b = a.set_index('ID')
b.columns = b.columns.str.split('-', expand=True)
b = b.stack().droplevel(-1).reset_index()

     ID   A   B   C
0  ID_1  a1  b1  c1
1  ID_1  a2  b2  c2
2
Henry Ecker 26 जिंदा 2022, 21:12
दूसरा दृष्टिकोण मेरे लिए एक आकर्षण की तरह काम करता है क्योंकि मेरे पास कई स्टबनाम हैं और क्योंकि कोड अन्य सभी उत्तरों में सबसे संक्षिप्त है। फिर भी इस नए पांडा फ़ंक्शन (wide_to_long) को खोजना बहुत जानकारीपूर्ण था। धन्यवाद
 – 
sel
27 जिंदा 2022, 13:08

यह दृष्टिकोण कुछ मध्यवर्ती कॉलम उत्पन्न करेगा जिन्हें बाद में हटा दिया जाएगा।

सबसे पहले उन लेबल्स (A-1,...) को हेडर से एक कॉलम में नीचे लाएं

df = pd.melt(a, id_vars=['ID'], var_name='label')

फिर लेबल को कैरेक्टर और नंबर में विभाजित करें

df[['char', 'num']] = df['label'].str.split('-', expand=True)

अंत में unstack से पहले, set_index लेबल को छोड़ दें, और अंतिम तालिका प्रारूपों का ध्यान रखें।

df.drop('label', axis=1)\
    .set_index(['ID', 'num', 'char'])\
    .unstack()\
    .droplevel(0, axis=1)\
    .reset_index()\
    .drop('num', axis=1)
2
Raymond Kwok 26 जिंदा 2022, 20:50
import pandas as pd
import math
df=pd.DataFrame(data={k:[i*k for i in range(1,5)] for k in range (1,9)})
assert(df.shape[1]%2==0)
df_1=df.iloc[:,0:math.floor(df.shape[1]/2)]
df_2=df.iloc[:,math.floor(df.shape[1]/2):]
df_2.columns=df_1.columns
df_sum=pd.concat((df_1,df_2),axis=0)
display(df_sum)

इस तरह?यहां छवि विवरण दर्ज करें

0
Timo Junolainen 26 जिंदा 2022, 20:35

एक विकल्प pivot_longer फ़ंक्शन के साथ है pyjanitor से, जो रीशेपिंग प्रक्रिया को सारगर्भित करता है और कुशल भी है:

# pip install pyjanitor
import janitor
import pandas as pd

a.pivot_longer(index="ID", names_to=".value", names_pattern="(.).+")
 
     ID   A   B   C
0  ID_1  a1  b1  c1
1  ID_1  a2  b2  c2

.value फ़ंक्शन को बताता है कि कॉलम के किस हिस्से को बनाए रखना है। यह names_pattern से अपना संकेत लेता है, जो समूहों के साथ एक नियमित अभिव्यक्ति होनी चाहिए, समूहीकृत रेगेक्स वही हैं जो हेडर के रूप में रहते हैं। इस मामले में, प्रत्येक कॉलम का पहला अक्षर वह है जिसमें हम रुचि रखते हैं, जिसे (.) द्वारा दर्शाया जाता है।

एक अन्य विकल्प, pivot_longer के साथ है names_sep पैरामीटर का उपयोग करने के लिए:

(a.pivot_longer(index="ID", names_to=(".value", "num"), names_sep="-")
.drop(columns="num")
)

     ID   A   B   C
0  ID_1  a1  b1  c1
1  ID_1  a2  b2  c2

फिर से, केवल .value से जुड़े कॉलम में मान ही हेडर के रूप में रहते हैं।

1
sammywemmy 27 जिंदा 2022, 00:50
1
इस स्तर पर मैं किसी बाहरी निर्भरता का उपयोग नहीं करना पसंद करता हूं इसलिए मैंने हेनरी एकर का उत्तर चुना। आपको धन्यवाद
 – 
sel
27 जिंदा 2022, 13:09