2015-12-19 29 views
7

निम्नलिखित DataFrame मानते हुए ढेर:।पांडा DataFrame एकल स्तंभ में एकाधिक स्तंभ मान

key.0 key.1 key.2 topic 
1 abc def ghi  8 
2 xab xcd xef  9 

मैं सभी कुंजी के मान कैसे जोड़ सकते हैं * एकल स्तंभ 'कुंजी' में कॉलम, उस विषय के साथ संबद्ध है कुंजी के अनुरूप मूल्य। * कॉलम? यह परिणाम है मैं चाहता हूँ:

topic key 
1  8 abc 
2  8 def 
3  8 ghi 
4  9 xab 
5  9 xcd 
6  9 xef 

ध्यान दें कि key.N स्तंभों की संख्या कुछ बाहरी एन पर चर रहा है

उत्तर

12

आप अपने dataframe पिघला कर सकते हैं:

>>> keys = [c for c in df if c.startswith('key.')] 
>>> pd.melt(df, id_vars='topic', value_vars=keys, value_name='key') 

    topic variable key 
0  8 key.0 abc 
1  9 key.0 xab 
2  8 key.1 def 
3  9 key.1 xcd 
4  8 key.2 ghi 
5  9 key.2 xef 

यह भी देता है आप कुंजी का स्रोत।


v0.20 से, meltpd.DataFrame वर्ग के एक प्रथम श्रेणी के समारोह है:

>>> df.melt('topic', value_name='key').drop('variable', 1) 

    topic key 
0  8 abc 
1  9 xab 
2  8 def 
3  9 xcd 
4  8 ghi 
5  9 xef 
+0

सरल और बहुत तेजी से उपयोग करना द्वारा। धन्यवाद। – borice

2

विभिन्न तरीकों की कोशिश के बाद, मुझे लगता है निम्नलिखित कम या ज्यादा सहज है, प्रदान की stack के जादू समझा जाता है :

# keep topic as index, stack other columns 'against' it 
stacked = df.set_index('topic').stack() 
# set the name of the new series created 
df = stacked.reset_index(name='key') 
# drop the 'source' level (key.*) 
df.drop('level_1', axis=1, inplace=True) 

जिसके परिणामस्वरूप dataframe आवश्यक है:

topic key 
0  8 abc 
1  8 def 
2  8 ghi 
3  9 xab 
4  9 xcd 
5  9 xef 

आप पूरी तरह से प्रक्रिया को समझने के लिए मध्यस्थ परिणामों को मुद्रित करना चाह सकते हैं। यदि आपको आवश्यकतानुसार अधिक कॉलम रखने में कोई फर्क नहीं पड़ता है, तो महत्वपूर्ण कदम set_index('topic'), stack() और reset_index(name='key') हैं।

+0

मुझे 'reset_index' के लिए 'name' तर्क पर कोई दस्तावेज नहीं मिल रहा है, क्या आप यह समझा सकते हैं कि यह कैसे काम करता है? – imp9

+0

यह [series.reset_index()] है (http://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.reset_index.html?highlight=reset_index) – miraculixx

1

ठीक है, क्योंकि वर्तमान प्रश्न में से एक इस प्रश्न के डुप्लिकेट के रूप में चिह्नित है, मैं यहां जवाब दूंगा।

wide_to_long

pd.wide_to_long(df, ['key'], 'topic', 'age').reset_index().drop('age',1) 
Out[123]: 
    topic key 
0  8 abc 
1  9 xab 
2  8 def 
3  9 xcd 
4  8 ghi 
5  9 xef 
संबंधित मुद्दे