重塑和过滤数据框架

2024-07-08 14:44:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我想用等于1的单元格过滤掉下面数据框(df1)中的所有值,并创建一个新的数据框,其中每一行都有对应单元格中的行和列(如下面的df2所示):

dict1 = [{'12/21/18': 0,'12/22/18': 0,'12/23/18': 1,'12/24/18': 1},
     {'12/21/18': 1,'12/22/18': 1,'12/23/18': 0,'12/24/18': 1},
     {'12/21/18': 0,'12/22/18': 1,'12/23/18': 0,'12/24/18': 0},
     {'12/21/18': 1,'12/22/18': 0,'12/23/18': 1,'12/24/18': 1}]


df1 = pd.DataFrame(dict1, index= ['AAPL','CSCO','GE','MSFT' ])

dict2 = [{'Ticker': 'AAPL','Date': '12/23/18'},
     {'Ticker': 'AAPL','Date': '12/24/18'},
     {'Ticker': 'CSCO','Date': '12/22/18'},
     {'Ticker': 'CSCO','Date': '12/24/18'},
     {'Ticker': 'GE',  'Date': '12/22/18'},
     {'Ticker': 'MSFT','Date': '12/24/18'}]


df2 = pd.DataFrame(dict2)

有人能提出一种方法来这样做吗?你知道吗


Tags: 数据dataframedateindexpdticker行和列df1
3条回答

我认为最简单的方法如下:

df1.index.name = 'Ticker' # First reset the name so it will match your desired output (default is 'index')
df2 = df1.reset_index().melt(id_vars='Ticker',var_name='Date') # This unstacks the data

最后,为了将其转换为所需的形式,我们删除0,重置索引,然后排序:

df2 = df2[df2.value == 1].set_index('Ticker').filter(['Date','Ticker']).sort_index()

您可以尝试查看dataframe的值,并获得一个索引数组,其中该值大于0。然后可以使用索引和列名列表中的索引来构建新的数据帧。你知道吗

import numpy as np
idx = np.argwhere(df1.values > 0)

# Get a list of the ticker index and column names
ticker_list = df1.index.tolist()
date_list = df1.columns.tolist()
ticker = []
date = []

for value in idx:
    ticker.append(ticker_list[value[0]])
    date.append(date_list[value[1]])

df2 = pd.DataFrame({'Ticker': ticker, 'Date': date})

这里是@slayer和@lucash给出的方法的性能比较。我还添加了第三种方法。你知道吗

@slayer method 
%%timeit 
1.12 ms ± 61.1 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

@Lucas H method
%%timeit
5.16 ms ± 735 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

@Third method
%%timeit
4.4 ms ± 232 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)


# Third method
df1 = df1.T
df2 = pd.melt(df1.where(df1==0, df1.index))
df2 = df2[df2.value != 0]
df2.columns = ['Ticker', 'Date']

显然,@slayer的方法胜过一切。你知道吗

相关问题 更多 >

    热门问题