পান্ডারা কয়েকটি কলামকে সারিতে রূপান্তর করে


115

সুতরাং আমার ডেটাসেটে n তারিখের জন্য অবস্থান অনুসারে কিছু তথ্য রয়েছে। সমস্যাটি প্রতিটি তারিখটি আসলে একটি আলাদা কলাম শিরোনাম। উদাহরণস্বরূপ সিএসভি দেখতে লাগে

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


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

পুরানো (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


@ ডিএসএম এই ফাংশনটির বিপরীতটি কী হবে উদাহরণস্বরূপ, কেউ কীভাবে df2[পিছনে]df
কেএসটিসি

1
@ 3kstc এখানে বা এখানে চেষ্টা করুন । আপনি পিভটগুলি সন্ধান করতে চাইছেন। সম্ভবত pandas.pivot_table(df2,values='Value',index=['location','name'],columns='Date').reset_index()
তিপিম্ম

1
@ ডিএসএম পিছনে যাওয়ার কোনও উপায় আছে? মানে একই নামটি নিয়ে আমার প্রচুর সারি রয়েছে এবং আমি চাই যে সমস্ত তারিখ বিভিন্ন কলামে থাকবে
অ্যাড্রিয়ান

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')

পুরো CONCAT 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
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.