在数据帧上迭代的Pandasic方法

2024-09-30 22:13:40 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在用excel输入制作一个测试团队报告;使用pandas收集、过滤、处理数据。你知道吗

我做了下面的代码来制作产品测试用例封面表,以便以后使用/方便搜索。第3列是测试用例的类型。我在一个excel中有多个测试用例,所以我需要遍历所有的单元格和拆分测试,以生成成对的产品测试用例。你知道吗

因为我对熊猫不太熟悉,而且我在其他地方也没有找到更好的方法,我想问一下,是否有更多的Python方法或者更简单的熊猫方法来做同样的事情,更有效。你知道吗

带有示例数据的代码(\n是excel单元格中的换行符):

df = pd.DataFrame({"prod":["TS001","TS002"], 
                   "activate":["001_002\n001_004", "003_008\n024_080"],
                   "deactivate":["004_005\n006_008", "001_008"]})
df = df.set_index("prod")

list_of_tuples = []

for i, row in df.iterrows():
    for cell in row.iteritems():
        for test in cell[-1].splitlines():
            list_of_tuples.append((i, test, cell[0]))  # [(product, test, category)..]

return_df = pd.DataFrame(list_of_tuples, columns=('prod', 'testcase', 'category'))

生产:

    prod testcase    category
0  TS001  001_002    activate
1  TS001  001_004    activate
2  TS001  004_005  deactivate
3  TS001  006_008  deactivate
4  TS002  003_008    activate
5  TS002  024_080    activate
6  TS002  001_008  deactivate

谢谢你的建议。你知道吗


Tags: of方法indffor测试用例cellprod
3条回答

用途:

  • ^{}喜欢你的解决方案吗
  • ^{}用于使用lambda函数处理DataFrameby ^{}expand=True的多个列,并按^{}重塑
  • ^{}对于Multiindex
  • ^{}首先是remove level,然后是Multiindexto columns
  • 重命名列
  • ^{}表示列的更改顺序

df = (df.set_index('prod')
        .apply(lambda x: x.str.split('\n', expand=True).unstack())
        .stack()
        .reset_index(level=0, drop=True)
        .reset_index(name='testcase')
        .rename(columns={'level_1':'category'})
        .reindex_axis(['prod','testcase','category'], axis=1))
print (df)
    prod testcase    category
0  TS001  001_002    activate
1  TS001  004_005  deactivate
2  TS002  003_008    activate
3  TS002  001_008  deactivate
4  TS001  001_004    activate
5  TS001  006_008  deactivate
6  TS002  024_080    activate

带着理解力

pd.DataFrame(
    [(p, t, c) for (p, c), r in df.stack().items() for t in r.split()],
    columns=['prod', 'testcase', 'category']
)

    prod testcase    category
0  TS001  001_002    activate
1  TS001  001_004    activate
2  TS001  004_005  deactivate
3  TS001  006_008  deactivate
4  TS002  003_008    activate
5  TS002  024_080    activate
6  TS002  001_008  deactivate

解释

df.stack()

prod             
TS001  activate      001_002\n001_004
       deactivate    004_005\n006_008
TS002  activate      003_008\n024_080
       deactivate             001_008
dtype: object

df.stack().items()上迭代时,我们得到的元组的第一个元素是index value,第二个元素是value。因为我们叠加,索引值本身就是一个元组。第一对看起来像:

(('TS001', 'activate'), '001_002\n001_004')

通过对'001_002\n001_004'.split()的后续迭代并重新排列未打包的元素,我们得到

[(p, t, c) for (p, c), r in df.stack().items() for t in r.split()]

[('TS001', '001_002', 'activate'),
 ('TS001', '001_004', 'activate'),
 ('TS001', '004_005', 'deactivate'),
 ('TS001', '006_008', 'deactivate'),
 ('TS002', '003_008', 'activate'),
 ('TS002', '024_080', 'activate'),
 ('TS002', '001_008', 'deactivate')]

然后将其包装在pd.DataFrame构造函数中,在其中命名列。你知道吗

使用df.applymapdf.meltdf.stack

df = df.applymap(str.split).reset_index().melt('prod', \
              ['activate', 'deactivate']).set_index(['prod', 'variable'])
df = pd.DataFrame(df.value.tolist(), index=df.index)\
                         .stack().reset_index().drop('level_2', 1) 
df.columns = ['prod', 'category', 'testcase']

df
    prod    category testcase
0  TS001    activate  001_002
1  TS001    activate  001_004
2  TS002    activate  003_008
3  TS002    activate  024_080
4  TS001  deactivate  004_005
5  TS001  deactivate  006_008
6  TS002  deactivate  001_008

相关问题 更多 >