pandas Python:创建数据框架,其中值与列名匹配

gab6jxml  于 2023-03-28  发布在  Python
关注(0)|答案(2)|浏览(145)

我想把两个列表放在一个dataframe中。
我的第一个列表包含各种日期。

my_dates = ['20/12/2024', '31/08/2022', '19/08/2022', '21/06/2024']

第二个列表是包含各种股票名称和日期的列表的列表。

my_stocks = [
    ["AAPL", ['20/12/2024', '31/08/2022']],
    ["MSFT", ['20/12/2024', '31/08/2022', '21/06/2024']], 
    ["TSLA", []], 
    ["META", ['20/12/2024', '31/08/2022', '19/08/2022', '21/06/2024']]
]

我想把这两个列表放在一个dataframe中,其中:

  • 标题/列名是my_dates的值
  • 每行的第一个值是股票名称
  • 如果“单元格”的值等于列名,则该值为日期
2024年12月20日2022年8月31日2022年8月19日2024年6月21日
AAPL语言2024年12月20日2022年8月31日
MSFT2024年12月20日2022年8月31日2024年6月21日
传输层协议
meta2024年12月20日2022年8月31日2022年8月19日2024年6月21日

我想到了一些东西

new = []

for elem in my_stocks:
    new.append(elem)

df = pd.DataFrame(new)

df = pd.concat([df[0],df[1].apply(pd.Series)],axis=1)

print(df)

但这不包括标题,并且日期与标题不匹配。
正如你所看到的,我是Python的新手,任何帮助都非常感谢!
非常感谢Mika

r7s23pms

r7s23pms1#

这里是一个方法,创建每个股票作为它自己的pandas系列,然后使用pd.concat使它们成为一个dataframe.然后使用my_dates选择要使用的日期,并将表转置以匹配您所需的输出

import pandas as pd

my_dates = ['20/12/2024', '31/08/2022', '19/08/2022', '21/06/2024']
my_stocks = [["AAPL", ['20/12/2024', '31/08/2022']],["MSFT", ['20/12/2024', '31/08/2022', '21/06/2024']], ["TSLA", []], ["META", ['20/12/2024', '31/08/2022', '19/08/2022', '21/06/2024']]]

stock_df = pd.concat((pd.Series(ds, ds, name=n, dtype='object') for n,ds in my_stocks), axis=1)
stock_df = stock_df.loc[my_dates]

stock_df = stock_df.T
print(stock_df)

628mspwn

628mspwn2#

通常在这种情况下,最好使用纯python将数据转换为正确的格式,然后使用处理后的数据创建DataFrame。它使您的代码更简单,更具可读性,并且通常比使用基于pandas的解决方案更有效。

import pandas as pd
import numpy as np 

my_dates = ['20/12/2024', '31/08/2022', '19/08/2022', '21/06/2024']

my_stocks = [
    ["AAPL", ['20/12/2024', '31/08/2022']],
    ["MSFT", ['20/12/2024', '31/08/2022', '21/06/2024']], 
    ["TSLA", []], 
    ["META", ['20/12/2024', '31/08/2022', '19/08/2022', '21/06/2024']]
]

stocks, data = zip(*my_stocks)

data = [[date if date in row else np.nan 
         for date in my_dates] 
         for row in data]

df = pd.DataFrame(data, index=stocks, columns=my_dates)

输出:

>>> df

      20/12/2024  31/08/2022  19/08/2022  21/06/2024
AAPL  20/12/2024  31/08/2022         NaN         NaN
MSFT  20/12/2024  31/08/2022         NaN  21/06/2024
TSLA         NaN         NaN         NaN         NaN
META  20/12/2024  31/08/2022  19/08/2022  21/06/2024

相关问题