[英]How to iterate a pandas df to make another pandas df?
嗨,我有一個 dataframe df
,它有這樣的標題:
DATE COL1 COL2 ... COL10
date1 a b
... ... ... ...
and so on
基本上每一行只是一個日期,然后是同一行上的一堆列,其中包含一些文本或沒有文本。
由此我想創建一個新的 df df2
,它在原始數據框中的每個非空白“單元格”都有一行,由日期和該單元格中的文本組成。 從上面的例子我們可以得到
df2=
DATE COL
date1 a
date1 b
在偽代碼中我想要實現的是:
df2 = blank df
for row in df:
for column in row:
if cell is not empty:
append to df2 a row consisting of the date for that row and the value in that cell
到目前為止我有
import pandas as pd
df = pd.read_csv("data2.csv")
output_df = pd.DataFrame(columns=['Date', 'Col'])
基本上我已經閱讀了 df,並創建了新的 df 以開始填充。
現在我被卡住了,一些調查告訴我我不應該使用iterrows()
因為它不是有效和不好的做法,而且我在 df 中有 300k+ 行。
請問有什么建議嗎?
使用df.melt
:
data = [{'date': f'date{j}', **{f"col{i}": val for i, val in enumerate('abc')}} for j in range(5)]
df = pd.DataFrame(data)
date col0 col1 col2
0 date0 a b c
1 date1 a b c
2 date2 a b c
3 date3 a b c
4 date4 a b c
df2 = df.melt(
id_vars=['date'],
value_vars=df.filter(like='col').columns,
value_name='Col'
)[['date', 'Col']]
# to get the ordering the way you want
df2 = df2.sort_values(by='date').reset_index(drop=True)
date Col
0 date0 a
1 date0 b
2 date0 c
3 date1 a
4 date1 b
5 date1 c
6 date2 a
7 date2 b
8 date2 c
9 date3 a
10 date3 b
11 date3 c
12 date4 a
13 date4 b
14 date4 c
然后,您可以從Col
中過濾掉任何 null 值:
df2 = df2[df2['Col'].apply(bool)]
您需要將空白單元格轉換為 NA。
IE
df[df == ''] = np.nan
df.metl('DATE').dropna()
您可以將多列加入一個列表
s = df.filter(like='COL').apply(lambda row: row[row.notna()].tolist(), axis=1)
然后在那個名單上explode
df_ = pd.DataFrame({'DATE':df['DATE'], 'COL': s})
df_ = df_.explode('COL')
print(df_)
DATE COL
0 date1 a
0 date1 b
1 date2 c
1 date2 d
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.