【问题标题】:How to add Column to DataFrame while keeping dates correlated如何在保持日期相关的同时将列添加到 DataFrame
【发布时间】:2022-01-24 05:47:19
【问题描述】:

我正在使用 Pandas 和 Matplotlib 绘制一些加密交易图表。

我正在使用的列是Amount,我试图在其中绘制传入和传出交易的图表。传入的号码前面有a +,传出的有a -

目标是使用 Matplotlib 创建包含传入和传出事务的条形图。

我认为需要对Amount 列进行排序,如果它包含a +a -,然后每种类型都有自己的与交易日期相关的列。

例如,第一行的 +20,000 交易将归档在 Incoming Transactions 列下,而在它最初所在的同一行(以保持相同的日期)。

我已尝试创建此列,但根据我的错误代码,我在创建新列时遇到了麻烦。

parse_dates = ['Time']
df = pd.read_csv('DSb5CvAXhXnzFoxmiMaWpgxjDF6CfMK7h2.csv', index_col=0, parse_dates=parse_dates)

df2 = df.assign(Outgoing = df.loc[df["Amount"].str.contains('\-', regex=True)]) 

#outgoing_transactions = df.loc[df["Amount"].str.contains('\-', regex=True)]

#incoming_transactions = df.loc[df["Amount"].str.contains('\+', regex=True)]

df2

这是我收到的错误代码:

ValueError: 传递的项目数错误 5,位置暗示 1

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    您可以使用正则表达式从Amount 列中的extract 仅使用相对于狗狗币的值。然后,创建一个变量来指示事务的方向,并将其与访问器.dt.date 一起使用来创建组。

    使用aggsum 添加同一天内的值和交易类型,然后使用unstack 将交易类型转为两个不同的列。使用创建的列使用两个不同的plt.bar 命令绘制数据,这将产生同一天的两个柱的效果,每个交易类型一个。

    df用作输入

                                Time                              Amount
    0  2022-01-01 00:00:00.000000000  +7,965,429.87 DOGE (18,343.48 USD)
    1  2022-01-01 07:30:54.545454545  -5,986,584.84 DOGE (15,601.86 USD)
    2  2022-01-01 15:01:49.090909090    +999,749.16 DOGE (45,924.89 USD)
    3  2022-01-01 22:32:43.636363636  +6,011,150.12 DOGE (70,807.26 USD)
    4  2022-01-02 06:03:38.181818181    -564,115.79 DOGE (72,199.88 USD)
    ..                           ...                                 ...
    95 2022-01-30 17:56:21.818181818  -6,454,722.96 DOGE (17,711.07 USD)
    96 2022-01-31 01:27:16.363636363  -4,699,445.14 DOGE (27,956.03 USD)
    97 2022-01-31 08:58:10.909090909    -3,701,587.0 DOGE (1,545.66 USD)
    98 2022-01-31 16:29:05.454545454   -3,307,503.05 DOGE (55,276.5 USD)
    99 2022-02-01 00:00:00.000000000  +9,636,199.77 DOGE (85,300.95 USD)
    
    [100 rows x 2 columns]
    
    df['DOGE'] = df['Amount'] \
        .str.extract(r'([+-](?:\d+,?)+?(?:.\d+)?)\s') \
        .replace(",","", regex=True).astype(float)
    
    flow = df['DOGE'].apply(lambda x: "outcome" if x<0 else "income")
    
    grouped = df.groupby([df['Time'].dt.date, flow])
    action = grouped.agg(amount=('DOGE', sum)).unstack()
    
    if ('amount','income') in action:
        plt.bar(action.index, action[('amount', 'income')], color='g', label='income')
    if ('amount', 'outcome') in action:
        plt.bar(action.index, action[('amount', 'outcome')], color='r', label='outcome')
    
    plt.xticks(rotation=45)
    plt.legend()
    plt.show()
    

    【讨论】:

      猜你喜欢
      • 2023-04-01
      • 2021-08-13
      • 2018-07-19
      • 2018-06-01
      • 2020-12-01
      • 1970-01-01
      • 2019-04-23
      • 2019-06-29
      • 1970-01-01
      相关资源
      最近更新 更多