簡體   English   中英

如何迭代一個 pandas df 來制作另一個 pandas df?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM