【问题标题】:Data Wrangling in Python to Create a ListPython 中的数据整理以创建列表
【发布时间】:2021-10-13 05:12:20
【问题描述】:

我在下面的 Python 中有一个数据框:

import pandas as pd
df = pd.DataFrame({
    'CRDACCT_DLQ_CYC_1_MNTH_AGO' : [3, 2, 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C'], 
    'CRDACCT_DLQ_CYC_2_MNTH_AGO': [4, 3, 3, 3, 3, 3, 2, 0, 5, 4, 3, 2, 0, 2, 2, 2, 2, 2, 2, 0, 2, 2, 0, 2], 
    'CRDACCT_DLQ_CYC_3_MNTH_AGO': [8, 7, 6, 5, 4, 3, 2, 'F', 'F', 0, 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'F', 'C', 'C', 'F', 'F'], 
    'CRDACCT_DLQ_CYC_4_MNTH_AGO' : [0, 2, 'F', 'F', 'C', 'C', 'C', 'C', 0, 2, 0, 2, 0, 2, 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'F', 'C', 'F'], 
    'CRDACCT_DLQ_CYC_5_MNTH_AGO' : [2, 2, 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C'], 
    'CRDACCT_DLQ_CYC_6_MNTH_AGO' : [2, 2, 2, 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 0, 2, 0, 2, 0], 
    'CRDACCT_DLQ_CYC_7_MNTH_AGO' : [3, 3, 2, 'C', 'C', 'C', 'F', 0, 6, 5, 4, 3, 2, 2, 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C'], 
    'CRDACCT_DLQ_CYC_8_MNTH_AGO' : [5, 4, 4, 3, 3, 2, 3, 2, 2, 2, 1, 2, 0, 2, 'C', 'C', 0, 2, 2, 2, 'C', 'C', 0, 'Z'], 
    'CRDACCT_DLQ_CYC_9_MNTH_AGO' : [2, 2, 'C', 0, 2, 0, 2, 'C', 'C', 'C', 'C', 'C', 0, 3, 2, 'C', 'F', 'C', 'F', 'F', 'F', 'F', 'F', 'F'], 
    'CRDACCT_DLQ_CYC_10_MNTH_AGO' : [5, 4, 3, 2, 3, 2, 0, 2, 0, 2, 'C', 'C', 'F', 2, 'F', 'F', 'F', 'F', 'F', 'F', 'F', 'F', 'F', 'C'], 
    'CRDACCT_DLQ_CYC_11_MNTH_AGO' : [4, 3, 2, 'F', 2, 0, 'Z', 'Z', 'Z', 'Z', 'Z', 'Z', 'Z', 'Z', 'Z', 'Z', 'Z', 'Z', 'Z', 'Z', 'Z', 'Z', 'Z', 'Z'], 
    'CRDACCT_DLQ_CYC_12_MNTH_AGO' : ['F', 8, 7, 6, 5, 4, 3, 2, 'C', 'C', 'C', 0, 2, 'C', 'C', 0, 2, 0, 3, 2, 'C', 'C', 'F', 2]
})

df.head()

我想将这些值(字符串值:C、F 和 Z)转换为具有以下条件的某些类别: 如果 CRDACCT_DLQ_CYC_1_MNTH_AGO、CRDACCT_DLQ_CYC_2_MNTH_AGO、......、CRDACCT_DLQ_CYC_12_MNTH_AGO 列中的值组成:

C = -1
F = -2
Z = -3
else value  = value 

然后我转置表格以识别自 Dlq (MSD) 以来的月份。

dfT =pd.DataFrame(df.T).reset_index(inplace=False)
dfT

我想创建一个名为 MSD 的列表。如果 MSD 大于 1(值 > 1),则根据值标识 MSD。例如,在索引2中CRDACCT_DLQ_CYC_1_MNTH_AGO = C或在它改变后=-1不大于1。那么,检查CRDACCT_DLQ_CYC_2_MNTH_AGO是否大于1? CRDACCT_DLQ_CYC_2_MNTH_AGO = 3 大于 1。因此,MSD is 2 因为它在 CRDACCT_DLQ_CYC_2_MNTH_AGO 中。识别的详细流程图和概览表

MSD 值介于 1 和 12 之间,取决于 i 中的 CRDACCT_DLQ_CYC_i_MNTH_AGOfor i = 1,2,3,...,12所以最终结果是一个有 24 个值的 MSD 列表,为每个索引 0 -23 标识。

【问题讨论】:

  • 这就是你尝试过的所有代码吗?
  • 是的。但是如何首先将 C= -1, F = -2, 和 Z = -3 的值更改为这个数据集,以便我可以识别出值 > 1 的每一行?

标签: python pandas list data-wrangling


【解决方案1】:

是不是你想要的:

# From your dataframe
MSD = df.T.apply(pd.to_numeric, errors='coerce').ge(1).idxmax(axis=0) \
        .str.extract(r'CYC_(\d+)_MNTH', expand=False).astype(int).tolist()

print(MSD)

# Output:
[1, 1, 2, 2, 2, 2, 2, 8, 2, 2, 2, 2, 7, 2, 2, 2, 2, 2, 2, 8, 2, 2, 6, 2]

【讨论】:

  • 我期望的最终结果是 MSD = [1,1,2,2,2,2,2,10, 2, 2,2,2,7,2,2,2,2 ,2]。将上个月的值 > 1 的值放入与 CRDACCT_DLQ_CYC_i_MNTH_AGO 上的 i 相同的列表中。例如,当 CRDACCT_DLQ_CYC_1_MNTH_AGO = 2 时,MSD 为 1,因为它大于 1。
  • @AnwarSanusi。随着预期的输出总是更清楚:)。我更新了我的答案,请您检查一下吗?
  • 最终结果为真。但我无法从MSD = df.T.apply(pd.to_numeric, errors='coerce').gt(1).idxmax(axis=0) \ .str.extract(r'CYC_(\d+)_MNTH', expand=False).astype(int).tolist() 成功执行得到一个错误:AttributeError: Can only use .str accessor with string values!
  • 如果您的数据框已经像图像上一样被转置,请尝试删除 .T
  • 它通过删除 .T 起作用。但是 #My Output : [2, 2, 2, 2, 2, 2, 2, 8, 2, 2, 2, 2, 7, 2, 2, 2, 2, 2, 2, 8, 2, 2, 6, 2] 这是错误的。如上所示,您的输出是正确的答案。 #你的输出[1, 1, 2, 2, 2, 2, 2, 8, 2, 2, 2, 2, 7, 2, 2, 2, 2, 2, 2, 8, 2, 2, 6, 2]。我关心的是索引 0 和 1 ,值为 2,2,正确答案应该是 1,1 作为你的。
猜你喜欢
  • 1970-01-01
  • 2011-05-09
  • 1970-01-01
  • 2021-02-20
  • 2014-09-24
  • 2014-12-22
  • 1970-01-01
  • 2020-05-12
相关资源
最近更新 更多