मेरे पास एक बड़ा डेटाफ़्रेम 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'}])
मेरे पास एक विचार है कि इस डेटाफ़्रेम को दो डेटाफ़्रेम में विभाजित करना है (डेटाफ़्रेम 1 में A1 से C1 तक के कॉलम होंगे और डेटाफ़्रेम 2 में A2 से C2 तक के कॉलम होंगे) कॉलम का नाम बदलकर A/B/C करें और दोनों को संयोजित करें। लेकिन मैं दक्षता के मामले में निश्चित नहीं हूं क्योंकि मेरे पास 90 कॉलम हैं जो समय के साथ बढ़ेंगे।
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
यह दृष्टिकोण कुछ मध्यवर्ती कॉलम उत्पन्न करेगा जिन्हें बाद में हटा दिया जाएगा।
सबसे पहले उन लेबल्स (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)
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)
एक विकल्प 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
से जुड़े कॉलम में मान ही हेडर के रूप में रहते हैं।
संबंधित सवाल
नए सवाल
python
पायथन एक बहु-प्रतिमान है, गतिशील रूप से टाइप किया हुआ, बहुउद्देशीय प्रोग्रामिंग भाषा है। यह एक साफ और एक समान वाक्यविन्यास सीखने, समझने और उपयोग करने के लिए त्वरित होने के लिए डिज़ाइन किया गया है। कृपया ध्यान दें कि अजगर 2 आधिकारिक तौर पर 01-01-2020 के समर्थन से बाहर है। फिर भी, संस्करण-विशिष्ट पायथन सवालों के लिए, [अजगर -२.०] या [अजगर -३.x] टैग जोड़ें। पायथन वेरिएंट (जैसे, ज्योथन, PyPy) या लाइब्रेरी (उदा।, पांडस और न्यूमपी) का उपयोग करते समय, कृपया इसे टैग में शामिल करें।