【问题标题】:What is the correct way of selecting value from pandas dataframe using column name and row index?使用列名和行索引从熊猫数据框中选择值的正确方法是什么?
【发布时间】:2019-11-09 00:49:07
【问题描述】:

使用列名和行索引(我的意思是行号)从 pandas 数据框中选择值的最有效方法是什么?

我有一种情况,我必须遍历行:

我有一个可行的解决方案:

i = 0
while i < len(dataset) -1:
    if dataset.target[i] == 1:
        dataset.sum_lost[i] = dataset['to_be_repaid_principal'][i] + dataset['to_be_repaid_interest'][i]
        dataset.ratio_lost[i] = dataset.sum_lost[i] / dataset['expected_returned_sum'][i]
    else:
        dataset.sum_lost[i] = 0
        dataset.ratio_lost[i]= 0
    i += 1   

但是这个解决方案需要大量的 RAM。我还收到以下警告:

“正在尝试在 DataFrame 中的切片副本上设置值。”

所以我想再想一个:

i = 0
while i < len(dataset) -1:
    if dataset.iloc[i, :].loc['target'] == 1:
        dataset.iloc[i, :].loc['sum_lost'] = dataset.iloc[i, :].loc['to_be_repaid_principal'] + dataset.iloc[i, :].loc['to_be_repaid_interest']
        dataset.iloc[i, :].loc['ratio_lost'] = dataset.iloc[i, :].loc['sum_lost'] / dataset.iloc[i, :].loc['expected_returned_sum']
    else:
        dataset.iloc[i, :].loc['sum_lost'] = 0
        dataset.iloc[i, :].loc['ratio_lost'] = 0
    i += 1

但它不起作用。 我想提出一个更快/更少内存消耗的解决方案,因为这实际上是几个用户可以同时使用的网络应用程序。

非常感谢。

【问题讨论】:

  • 你能展示一个你的数据框的例子和你的预期输出吗?我只瘦你 nned loc 或 at
  • 也许this 会帮助你。

标签: python pandas


【解决方案1】:

如果您正在考虑“循环遍历行”,那么您没有正确使用 pandas。您应该考虑列的术语。

使用矢量化的np.where(阅读:快速):

cond = dataset['target'] == 1
dataset['sumlost'] = np.where(cond, dataset['to_be_repaid_principal'] + dataset['to_be_repaid_interest'], 0)
dataset['ratio_lost'] = np.where(cond, dataset['sumlost'] / dataset['expected_returned_sum'], 0)

【讨论】:

  • 非常感谢。我不知道如何使用 np.where。您的代码在 0.002 秒内运行。我的代码曾经运行 12 秒。
猜你喜欢
  • 2020-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-01
  • 2017-10-30
  • 2018-08-05
  • 1970-01-01
相关资源
最近更新 更多