ความท้าทายหนึ่งในแง่มุมที่ท้าทายที่สุดในการตอบคำถาม SO คือเวลาที่ใช้ในการสร้างปัญหาขึ้นใหม่ (รวมถึงข้อมูล) คำถามที่ไม่มีวิธีการที่ชัดเจนในการสร้างข้อมูลมีโอกาสน้อยที่จะตอบ เนื่องจากคุณใช้เวลาในการเขียนคำถามและมีปัญหาที่คุณต้องการความช่วยเหลือคุณสามารถช่วยตัวเองได้อย่างง่ายดายด้วยการให้ข้อมูลที่ผู้อื่นสามารถใช้เพื่อช่วยแก้ปัญหาของคุณ
คำแนะนำจาก @Andy สำหรับการเขียนคำถาม Pandas ที่ดีนั้นเป็นจุดเริ่มต้นที่ดีเยี่ยม สำหรับข้อมูลเพิ่มเติมอ้างถึงวิธีถามและวิธีสร้างตัวอย่างที่น้อยที่สุดสมบูรณ์และตรวจสอบได้
โปรดระบุคำถามของคุณอย่างชัดเจนล่วงหน้า หลังจากสละเวลาในการเขียนคำถามของคุณและโค้ดตัวอย่างใด ๆ ลองอ่านและให้ 'บทสรุปผู้บริหาร' สำหรับผู้อ่านของคุณซึ่งสรุปปัญหาและระบุคำถามไว้อย่างชัดเจน
คำถามเดิม :
ฉันมีข้อมูลนี้ ...
ฉันต้องการทำสิ่งนี้ ...
ฉันต้องการให้ผลลัพธ์ของฉันมีลักษณะเช่นนี้ ...
อย่างไรก็ตามเมื่อฉันพยายามทำสิ่งนี้ฉันได้รับปัญหาต่อไปนี้ ...
ฉันพยายามค้นหาวิธีแก้ปัญหาด้วยการทำ [สิ่งนี้] และ [สิ่งนั้น]
ฉันจะแก้ไขได้อย่างไร
ขึ้นอยู่กับปริมาณของข้อมูลโค้ดตัวอย่างและสแต็คข้อผิดพลาดที่มีให้ผู้อ่านต้องไปไกลก่อนที่จะเข้าใจว่าปัญหาคืออะไร ลองทบทวนคำถามของคุณใหม่เพื่อให้คำถามนั้นอยู่ด้านบนสุดจากนั้นให้รายละเอียดที่จำเป็น
คำถามที่มีการแก้ไข :
Qustion: ฉันจะทำ [สิ่งนี้] ได้อย่างไร?
ฉันพยายามค้นหาวิธีแก้ปัญหาด้วยการทำ [สิ่งนี้] และ [สิ่งนั้น]
เมื่อฉันพยายามทำสิ่งนี้ฉันได้รับปัญหาต่อไปนี้ ...
ฉันต้องการให้ผลลัพธ์สุดท้ายของฉันมีลักษณะเช่นนี้ ...
นี่คือรหัสขั้นต่ำที่สามารถทำให้เกิดปัญหาของฉันได้ ...
และนี่คือวิธีการสร้างข้อมูลตัวอย่างของฉันใหม่:
df = pd.DataFrame({'A': [...], 'B': [...], ...})
ให้ข้อมูลตัวอย่างถ้าจำเป็น !!!
บางครั้งเพียงแค่หัวหรือส่วนท้ายของ DataFrame เป็นสิ่งที่จำเป็น คุณยังสามารถใช้วิธีการที่เสนอโดย @JohnE เพื่อสร้างชุดข้อมูลขนาดใหญ่ที่คนอื่นสามารถทำซ้ำได้ ใช้ตัวอย่างของเขาเพื่อสร้าง DataFrame 100 แถวของราคาหุ้น:
stocks = pd.DataFrame({
'ticker':np.repeat( ['aapl','goog','yhoo','msft'], 25 ),
'date':np.tile( pd.date_range('1/1/2011', periods=25, freq='D'), 4 ),
'price':(np.random.randn(100).cumsum() + 10) })
หากนี่เป็นข้อมูลจริงของคุณคุณอาจต้องการรวมส่วนหัวและ / หรือส่วนท้ายของ dataframe ดังต่อไปนี้ (อย่าลืมเปิดเผยชื่อที่ละเอียดอ่อนของข้อมูลที่สำคัญ):
>>> stocks.head(5).to_dict()
{'date': {0: Timestamp('2011-01-01 00:00:00'),
1: Timestamp('2011-01-01 00:00:00'),
2: Timestamp('2011-01-01 00:00:00'),
3: Timestamp('2011-01-01 00:00:00'),
4: Timestamp('2011-01-02 00:00:00')},
'price': {0: 10.284260107718254,
1: 11.930300761831457,
2: 10.93741046217319,
3: 10.884574289565609,
4: 11.78005850418319},
'ticker': {0: 'aapl', 1: 'aapl', 2: 'aapl', 3: 'aapl', 4: 'aapl'}}
>>> pd.concat([stocks.head(), stocks.tail()], ignore_index=True).to_dict()
{'date': {0: Timestamp('2011-01-01 00:00:00'),
1: Timestamp('2011-01-01 00:00:00'),
2: Timestamp('2011-01-01 00:00:00'),
3: Timestamp('2011-01-01 00:00:00'),
4: Timestamp('2011-01-02 00:00:00'),
5: Timestamp('2011-01-24 00:00:00'),
6: Timestamp('2011-01-25 00:00:00'),
7: Timestamp('2011-01-25 00:00:00'),
8: Timestamp('2011-01-25 00:00:00'),
9: Timestamp('2011-01-25 00:00:00')},
'price': {0: 10.284260107718254,
1: 11.930300761831457,
2: 10.93741046217319,
3: 10.884574289565609,
4: 11.78005850418319,
5: 10.017209045035006,
6: 10.57090128181566,
7: 11.442792747870204,
8: 11.592953372130493,
9: 12.864146419530938},
'ticker': {0: 'aapl',
1: 'aapl',
2: 'aapl',
3: 'aapl',
4: 'aapl',
5: 'msft',
6: 'msft',
7: 'msft',
8: 'msft',
9: 'msft'}}
คุณอาจต้องการให้คำอธิบายของ DataFrame (ใช้เฉพาะคอลัมน์ที่เกี่ยวข้อง) ทำให้ผู้อื่นสามารถตรวจสอบประเภทข้อมูลของแต่ละคอลัมน์ได้ง่ายขึ้นและระบุข้อผิดพลาดทั่วไปอื่น ๆ (เช่นวันที่เป็นสตริงเทียบกับวันที่และเวลา 64 กับวัตถุ):
stocks.info()
<class 'pandas.core.frame.DataFrame'>
Int64Index: 100 entries, 0 to 99
Data columns (total 3 columns):
date 100 non-null datetime64[ns]
price 100 non-null float64
ticker 100 non-null object
dtypes: datetime64[ns](1), float64(1), object(1)
หมายเหตุ: หาก DataFrame ของคุณมี MultiIndex:
หากคุณมี DataFrame multiindex to_dict
ก่อนอื่นคุณต้องตั้งค่าก่อนที่จะเรียก จากนั้นคุณต้องสร้างดัชนีใหม่โดยใช้set_index
:
# MultiIndex example. First create a MultiIndex DataFrame.
df = stocks.set_index(['date', 'ticker'])
>>> df
price
date ticker
2011-01-01 aapl 10.284260
aapl 11.930301
aapl 10.937410
aapl 10.884574
2011-01-02 aapl 11.780059
...
# After resetting the index and passing the DataFrame to `to_dict`, make sure to use
# `set_index` to restore the original MultiIndex. This DataFrame can then be restored.
d = df.reset_index().to_dict()
df_new = pd.DataFrame(d).set_index(['date', 'ticker'])
>>> df_new.head()
price
date ticker
2011-01-01 aapl 10.284260
aapl 11.930301
aapl 10.937410
aapl 10.884574
2011-01-02 aapl 11.780059