【问题标题】:Iterating over a pandas dataframe using a list使用列表迭代熊猫数据框
【发布时间】:2022-01-02 12:00:11
【问题描述】:

我有一个交易数据框:

pd.DataFrame({'Date(UTC)': {0: Timestamp('2020-10-12 03:31:00'),
  1: Timestamp('2020-10-12 03:31:00'),
  2: Timestamp('2020-10-12 03:37:00'),
  3: Timestamp('2020-10-12 10:47:00'),
  4: Timestamp('2020-12-12 09:06:00')},
 'Pair': {0: 'AUDUSDT',
  1: 'AUDUSDT',
  2: 'AUDUSDT',
  3: 'ETHUSDT',
  4: 'AUDUSDT'},
 'Side': {0: 'SELL', 1: 'SELL', 2: 'SELL', 3: 'BUY', 4: 'SELL'},
 'Price': {0: '0.74201', 1: '0.742', 2: '0.74217', 3: '556.55', 4: '0.74831'},
 'Executed': {0: '23.1000000000AUD',
  1: '51.3000000000AUD',
  2: '25.6000000000AUD',
  3: '0.1331900000ETH',
  4: '37.5000000000AUD'},
 'Amount': {0: '17.14043100USDT',
  1: '38.06460000USDT',
  2: '18.99955200USDT',
  3: '74.12689450USDT',
  4: '28.06162500USDT'},
 'Fee': {0: '0.0171404300USDT',
  1: '0.0380646000USDT',
  2: '0.0189995500USDT',
  3: '0.0001331900ETH',
  4: '0.0280616300USDT'},
 'asset': {0: nan, 1: nan, 2: nan, 3: nan, 4: nan},
 'asset_2': {0: nan, 1: nan, 2: nan, 3: nan, 4: nan}})

我还有一个单独的代码列表:

tickers = ["AUD","USDT","ETH","BNB","TWT","GRT","OXT","ADA","BTC","XRP","MATIC","NANO","SHIB","TLM","LINK","XLM", 
          "THETA","SOL","VET","DOT","KSM","ALGO","INJ","REN","TFUEL","BUSD","LRC","CKB","1INCH"]

我正在尝试识别成对中的单个代码,以便将它们附加到各自的列(资产和资产_2)

我已经编写了一些成功完成此操作的代码:

# iterate over dataframe with list of tickers and append appropriate
for i, pair in enumerate(trades["Pair"]):
    for ticker in tickers:
        if ticker in pair and pair.index(ticker) == 0:
            trades["asset"][i] = ticker
        elif ticker in pair and pair.index(ticker) != 0:
            trades["asset_2"][i] = ticker

我的问题:这是执行此操作的最有效方法,还是更好的方法?虽然我很高兴它奏效了,但我不禁觉得这是一个笨拙的解决方案。

此外,在运行时,我会收到来自 Jupyter 的警告,但我不太明白:

/var/folders/yh/t_qzlr053q98srnwz3n8mlj40000gn/T/ipykernel_7535/4228300930.py:5: SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame

See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
  trades["asset"][i] = ticker
/opt/homebrew/lib/python3.9/site-packages/pandas/core/indexing.py:1732: SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame

See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
  self._setitem_single_block(indexer, value, name)
/var/folders/yh/t_qzlr053q98srnwz3n8mlj40000gn/T/ipykernel_7535/4228300930.py:7: SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame

See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
  trades["asset_2"][i] = ticker

【问题讨论】:

    标签: python pandas dataframe iteration


    【解决方案1】:

    您可以像这样重写循环以消除警告。

    for i, pair in enumerate(trades["Pair"]):
        for ticker in tickers:
            if ticker in pair and pair.index(ticker) == 0:
                trades.loc[i, 'asset'] = ticker
            elif ticker in pair and pair.index(ticker) != 0:
                trades.loc[[i], 'asset_2'] = ticker
    

    至于更快地拆分这对,这仅取决于是否存在模式。如果 'USDT' 始终是最后四个字符,您可以在不循环的情况下拆分或切片列。但是查看您的代码列表,这对可以包含 6-10 个字符,具体取决于该代码对中的哪些代码,因此除非源数据允许您根据其他信息创建列,否则不清楚如何使这更快。

    【讨论】:

      猜你喜欢
      • 2020-07-30
      • 2020-05-17
      • 2015-12-09
      • 1970-01-01
      • 2021-07-20
      • 2018-12-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多