วิธี (พร้อมใช้) เพื่อเลือกและคัดลอกคอลัมน์เฉพาะใน Dataframe ตามดัชนีหรือคอลัมน์อื่น

ฉันถามคำถามไปแล้ว แต่คำอธิบายยังไม่ถูกต้องเพียงพอ คนฉลาดในฟอรัมนี้เสนอวิธีแก้ปัญหาแล้ว แต่ฉันลืม (ขออภัย) ที่ต้องระบุให้แน่ชัดว่าหากมีเลขศูนย์ในคอลัมน์ที่เกี่ยวข้อง ก็ควรเก็บค่าเหล่านั้นไว้

สวัสดี ฉันมี dataframe เหมือนด้านล่าง

              2014  2015  2016  2017  2018  2019  

         2014   10    20    30    40    0      5
         2015   0     0    200    0    100     0       
         2016   0     0    200   140    35    10       
         2017   0     0     0     20     0    12       

ฉันต้องการผลลัพธ์เช่นนี้:

    yearStart  yearStart+1  yearStart+2  yearStart+3  yearStart+4  
0      10          20            30          40          0
1      0          200             0          100         0       
2     200         140            35          10          0
3      20          0             12           0          0

แนวคิดคือให้เลือกคอลัมน์ระหว่างวันที่สองวันในแต่ละแถว:

ดัชนีและดัชนี +เดลต้า โดยมีพารามิเตอร์เดลต้า (ในตัวอย่างนี้ 4) เพื่อใส่ไว้ในดาต้าเฟรม

ด้วย iterrows() มันใช้เวลานานเกินไป

ฉันก็พยายามด้วย

 df1 = df.apply(lambda x: pd.Series(x[x.keys()>=x.index],1)).fillna(0).astype(int)

แต่มันใช้งานไม่ได้:

TypeError: ('Index(...) must be called with a collection of some kind,
1 was passed', 'occurred at index 2014')

ขอบคุณ


person phil    schedule 19.09.2017    source แหล่งที่มา
comment
คุณควรแก้ไขคำถามแรกเพื่อชี้แจงข้อกำหนดของคุณ ไม่ใช่เปิดคำถามใหม่ที่เหมือนกับคำถามแรก   -  person GPhilo    schedule 19.09.2017
comment
ขออภัย ฉันเป็นมือใหม่ในฟอรัมนี้ ฉันขอโทษสำหรับความซุ่มซ่ามของฉัน ยังไงก็ขอบคุณนะ. ความจริงที่ว่าต้องเก็บเลขศูนย์บางตัวไว้ทำให้ฉันมีเหตุผลที่จะคิดว่ามันเป็นอีกกรณีหนึ่ง   -  person phil    schedule 19.09.2017


คำตอบ (1)


วิธีหนึ่งก็คือ

In [1010]: def yearmove(x):
      ...:     idx = x.index.astype(int)
      ...:     idx = idx - x.name
      ...:     mask = idx >= 0
      ...:     idx = 'yearStart' + idx.astype(str)
      ...:     return pd.Series(x.values[mask], index=idx[mask])
      ...:

In [1011]: df.apply(yearmove, 1).fillna(0).astype(int)
Out[1011]:
      yearStart0  yearStart1  yearStart2  yearStart3  yearStart4  yearStart5
2014          10          20          30          40           0           5
2015           0         200           0         100           0           0
2016         200         140          35          10           0           0
2017          20           0          12           0           0           0
person Zero    schedule 19.09.2017
comment
แทคคุณ. มันทำงานได้อย่างสมบูรณ์แบบ หากฉันต้องการมีเงื่อนไขเกี่ยวกับระยะเวลาของหน้าต่างเวลา ฉันจะเขียน mask=(idx›=0 และ idx‹=delta) แต่จะตอบ ValueError: ('ค่าความจริงของอาร์เรย์ที่มีองค์ประกอบมากกว่าหนึ่งองค์ประกอบนั้นคลุมเครือ ใช้ a.any() หรือ a.all()', 'เกิดขึ้นที่ดัชนี 2015') - person phil; 19.09.2017
comment
ฉันตระหนักถึงความผิดพลาดของฉัน :'และ' แทนที่จะเป็น '&' แต่มีข้อผิดพลาดประเภทระหว่าง 'int' และ 'int64' ด้วยตัวดำเนินการ '&'...ฉันกำลังติดตามมัน - person phil; 19.09.2017