पांडा कुछ स्तंभों को पंक्तियों में परिवर्तित करते हैं


115

इसलिए मेरे डेटासेट में n दिनांक के लिए स्थान के अनुसार कुछ जानकारी है। समस्या यह है कि प्रत्येक तिथि वास्तव में एक अलग कॉलम हैडर है। उदाहरण के लिए CSV जैसा दिखता है

location    name    Jan-2010    Feb-2010    March-2010
A           "test"  12          20          30
B           "foo"   18          20          25

जो मैं चाहूंगा, वह देखने जैसा है

location    name    Date        Value
A           "test"  Jan-2010    12       
A           "test"  Feb-2010    20
A           "test"  March-2010  30
B           "foo"   Jan-2010    18       
B           "foo"   Feb-2010    20
B           "foo"   March-2010  25

समस्या यह है कि मुझे पता नहीं है कि कॉलम में कितनी तारीखें हैं (हालांकि मुझे पता है कि वे हमेशा नाम के बाद शुरू करेंगे)


जवाबों:


207

UPDATE
from v0.20, meltएक पहला ऑर्डर फ़ंक्शन है, जिसे अब आप उपयोग कर सकते हैं

df.melt(id_vars=["location", "name"], 
        var_name="Date", 
        value_name="Value")

  location    name        Date  Value
0        A  "test"    Jan-2010     12
1        B   "foo"    Jan-2010     18
2        A  "test"    Feb-2010     20
3        B   "foo"    Feb-2010     20
4        A  "test"  March-2010     30
5        B   "foo"  March-2010     25

OLD (ER) संस्करण: <0.20

आप का उपयोग pd.meltकरने के लिए वहाँ सबसे अधिक रास्ता मिल सकता है, और फिर क्रमबद्ध करें:

>>> df
  location  name  Jan-2010  Feb-2010  March-2010
0        A  test        12        20          30
1        B   foo        18        20          25
>>> df2 = pd.melt(df, id_vars=["location", "name"], 
                  var_name="Date", value_name="Value")
>>> df2
  location  name        Date  Value
0        A  test    Jan-2010     12
1        B   foo    Jan-2010     18
2        A  test    Feb-2010     20
3        B   foo    Feb-2010     20
4        A  test  March-2010     30
5        B   foo  March-2010     25
>>> df2 = df2.sort(["location", "name"])
>>> df2
  location  name        Date  Value
0        A  test    Jan-2010     12
2        A  test    Feb-2010     20
4        A  test  March-2010     30
1        B   foo    Jan-2010     18
3        B   foo    Feb-2010     20
5        B   foo  March-2010     25

(शायद .reset_index(drop=True)आउटपुट को साफ रखने के लिए इसे फेंकना चाहते हैं ।)

नोट : के पक्ष pd.DataFrame.sort में पदावनत कर दिया गया है pd.DataFrame.sort_values


@DSM इस फ़ंक्शन का उलटा क्या होगा। यानी कैसे होगा एक परिवर्तित df2करने के लिए [वापस]df
3kstc

1
@ 3kstc यहाँ या यहाँ आज़माएँ । आप पिवोट्स में देखना चाहते हैं। संभवतः pandas.pivot_table(df2,values='Value',index=['location','name'],columns='Date').reset_index()
तेईपेम म

1
@DSM क्या पीछे जाने का कोई रास्ता है? मतलब कि मेरे पास एक ही नाम वाली बहुत सी पंक्तियाँ हैं और मैं चाहूंगा कि सभी तारीखें अलग-अलग कॉलम में हों
Adrian

17

का प्रयोग करें set_indexसाथ stackके लिए MultiIndex Seriesहै, तो के लिए DataFrameऐड reset_indexके साथ rename:

df1 = (df.set_index(["location", "name"])
         .stack()
         .reset_index(name='Value')
         .rename(columns={'level_2':'Date'}))
print (df1)
  location  name        Date  Value
0        A  test    Jan-2010     12
1        A  test    Feb-2010     20
2        A  test  March-2010     30
3        B   foo    Jan-2010     18
4        B   foo    Feb-2010     20
5        B   foo  March-2010     25

5

मुझे लगता है कि मुझे एक सरल समाधान मिला

temp1 = pd.melt(df1, id_vars=["location"], var_name='Date', value_name='Value')
temp2 = pd.melt(df1, id_vars=["name"], var_name='Date', value_name='Value')

कॉनटैट पूरे temp1के temp2कॉलम के साथname

temp1['new_column'] = temp2['name']

आपके पास अब वही है जो आपने मांगा था।


4

pd.wide_to_long

आप अपने वर्ष कॉलम में एक उपसर्ग जोड़ सकते हैं और फिर सीधे फ़ीड कर सकते हैं pd.wide_to_long। मैं यह दिखावा नहीं करूंगा कि यह कुशल है , लेकिन यह कुछ स्थितियों में अधिक सुविधाजनक हो सकता है pd.melt, जैसे जब आपके कॉलम में पहले से ही एक उपयुक्त उपसर्ग हो।

df.columns = np.hstack((df.columns[:2], df.columns[2:].map(lambda x: f'Value{x}')))

res = pd.wide_to_long(df, stubnames=['Value'], i='name', j='Date').reset_index()\
        .sort_values(['location', 'name'])

print(res)

   name        Date location  Value
0  test    Jan-2010        A     12
2  test    Feb-2010        A     20
4  test  March-2010        A     30
1   foo    Jan-2010        B     18
3   foo    Feb-2010        B     20
5   foo  March-2010        B     25
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.