小编Kai*_*sar的帖子

Pytest 停留在“收集...”

我有一个文件new_script_piped.py,其中包含我想测试的函数:

def columns_preparation(df):

    df.COLUMN_1.replace({'-999':'don't consider'}, inplace=True)
    ...more lines

    return df
Run Code Online (Sandbox Code Playgroud)

和测试文件test_new_script_piped.py

import pandas as pd
import new_script_piped as x

def test_columns_preparation(df):
    
    test_df = pd.read_excel('test_column_preparation.xlsx')
    result_df = pd.read_excel('test_column_preparation_result.xlsx')

    assert x.columns_preparation(test_df) == result_df
Run Code Online (Sandbox Code Playgroud)

所有文件都位于同一目录中。我在命令行上尝试过:

python3 -m pytest new_script_piped.py
Run Code Online (Sandbox Code Playgroud)
pytest new_script_piped.py
Run Code Online (Sandbox Code Playgroud)
python -m pytest new_script_piped.py
Run Code Online (Sandbox Code Playgroud)

他们都被搞砸了:

platform darwin -- Python 3.7.3, pytest-4.5.0, py-1.8.0, pluggy-0.11.0
rootdir: /Users/31275553/Documents/
collecting ... 
Run Code Online (Sandbox Code Playgroud)

python testing pytest pandas

10
推荐指数
1
解决办法
1万
查看次数

使用查找表确定值的范围

我有一个带有数字的 df:

numbers = pd.DataFrame(columns=['number'], data=[
50,
65,
75,
85,
90
])

Run Code Online (Sandbox Code Playgroud)

和一个带有范围的 df (查找表):

ranges = pd.DataFrame(
columns=['range','range_min','range_max'],
data=[
['A',90,100],
['B',85,95],
['C',70,80]
]
)
Run Code Online (Sandbox Code Playgroud)

我想确定值(在第一个表中)落在什么范围(在第二个表中)。请注意范围重叠,并且限制包括在内。另请注意,上面的普通数据框有 3 个范围,但该数据框是动态生成的。它可以有 2 到 7 个范围。

期望的结果:

numbers = pd.DataFrame(columns=['number','detected_range'], data=[
[50,'out_of_range'],
[65, 'out_of_range'],
[75,'C'],
[85,'B'],
[90,'overlap'] * could be A or B *
])
Run Code Online (Sandbox Code Playgroud)

我用 for 循环解决了这个问题,但这不能很好地扩展到我正在使用的大数据集。而且代码过于广泛且不优雅。见下文:

numbers['detected_range'] = nan
for i, row1 in number.iterrows():
    for j, row2 in ranges.iterrows():
        if row1.number<row2.range_min and row1.number>row2.range_max:
             numbers.loc[i,'detected_range'] = row1.loc[j,'range']
        else if (other cases...):
              ...and so …
Run Code Online (Sandbox Code Playgroud)

python pandas

8
推荐指数
1
解决办法
1113
查看次数

如何构建Python数据预处理管道的代码(用于生产)

我有一个具有定义的列结构的大型数据集,我为其构建了一个脚本/管道,通常执行以下操作:首先,摄取数据(格式化、清理等),其次,它转换值并创建一个新列这些新的转换值(最终结果)或多或少像这样:

  1. 将csv导入pandas框架,填充nans,清理某些列中的一些值,同质化文本、名称等。 1.1。创建一个新列(清理名称)
  2. 通过在字典中查找、进行分组等来转换/转换另一列中的值。 2.2 创建 1 个新列(转换后的值)

我的脚本分为两个文件(每个文件约 150 行代码),由许多方法组成:.where, .replace, .map, .apply, .etc. 鉴于 pandas 允许方法链接并且非常灵活,因此可以在不定义任何函数(除了一些 for )的情况下处理数据集df.apply(func)。我的代码将 csv 获取到 df 中,并自然地开始使用上述方法对其进行处理,.where, .replace, .map, .apply, .etc而不使用任何函数或.pipeline方法。我的项目树如下所示:

/project
    table.csv
    ingest.py (outputs a clean intermediate_table.csv)
    transform.py (reads previous table.csv and outputs a final_table.csv)
    final_table.csv
Run Code Online (Sandbox Code Playgroud)

问题是,我需要将此代码发送给其他将在更多数据集中运行我的脚本的人,因此我需要对其进行评论和测试。鉴于上述情况,这是我在代码结构方面的问题。

  • 我应该为上述每个步骤都有一个函数吗?
  • 如果是的话,粒度是多少?

例如,我应该有如下所示的多个功能吗?:

df = pd.read_csv('file.csv')

def uppercase_column_A(dataframe, col) 
def clean_column(dataframe, col) 
def calculate_mean_here(dataframe, col)
def transform_values_there(dataframe, col)

df
.pipe(uppercase_column_A)
.pipe(clean_column) …
Run Code Online (Sandbox Code Playgroud)

python pandas

5
推荐指数
1
解决办法
1388
查看次数

按值范围字典过滤数字列

我有一个数据框和一个字典:

df = 

VARIABLE VALUE
A        3
A        4
A        60
A        5
B        1
B        2
B        3
B        100
C        0
C        1
Run Code Online (Sandbox Code Playgroud)
df = 

VARIABLE VALUE
A        3
A        4
A        60
A        5
B        1
B        2
B        3
B        100
C        0
C        1
Run Code Online (Sandbox Code Playgroud)

我想根据字典中接受的范围清理 VALUE 列。

df = 

VARIABLE VALUE
A        3
A        4
A        NaN
A        5
B        1
B        2
B        3
B        NaN
C        0
C        1

Run Code Online (Sandbox Code Playgroud)

我试过:使用,map()但我似乎无法找到通过 VARIABLE …

python pandas

5
推荐指数
2
解决办法
172
查看次数

使用 lambda 函数进行分组和聚合

我正在尝试使用以编程方式创建的 lambda 函数对数据帧进行分组聚合。这样我就可以模拟列中存在的类别的单热编码器。

数据框:

df = pd.DataFrame(np.array([[10, 'A'], [10, 'B'], [20, 'A'],[30,'B']]),
                   columns=['ID', 'category'])

ID category
10 A
10 B
20 A
30 B

Run Code Online (Sandbox Code Playgroud)

预期结果:

ID A B
10 1 1
20 1 0
30 0 1
Run Code Online (Sandbox Code Playgroud)

我在尝试什么:

one_hot_columns = ['A','B']
lambdas = [lambda x: 1 if x.eq(column).any() else 0 for column in one_hot_columns]
df_g = df.groupby('ID').category.agg(lambdas)
Run Code Online (Sandbox Code Playgroud)

结果:

ID A B
10 1 1
20 0 0
30 1 1
Run Code Online (Sandbox Code Playgroud)

但是上面的结果并不完全是预期的结果。不知道我做错了什么。我知道我可以用 get_dummies 做到这一点,但使用 lambdas 更方便自动化。另外,我可以确保输出列的顺序。

python dataframe pandas

5
推荐指数
1
解决办法
78
查看次数

Pandas - 带小数位数的列

我有一个包含以下列的数据框(dtype='O'):

OUTPUT
1
0
3e-09
NaN
0.4
5.67
Run Code Online (Sandbox Code Playgroud)

并想添加一个新列,其中包含小于 0 的数字的小数位数:

OUTPUT   DECIMAL_PLACES
1         0
0         0
3e-09     9
NaN       NaN
0.4       1
5.67      0
Run Code Online (Sandbox Code Playgroud)

我天真地尝试转换为字符串,然后转换为 split('.') 但科学记数法不喜欢它。注意:我有一个很大的数据集,要浏览科学计数法的位置并不容易。

python pandas

4
推荐指数
1
解决办法
2473
查看次数

按条件向数据帧组广播值

数据框:

STUD_ID   CLASS   GRADE  CATEGORY 
1         'Sci'    max  'Alpha' 
2         'Sci'    7    'Omega' 
3         'Sci'    9    'Alpha' 
4         'Sci'    3    'Alpha' 
5         'Sci'    9    'Alpha' 
7         'eng'    max  'Gamma' 
8         'eng'    5    'Gamma' 
9         'eng'    3    'Epsilon'
10        'Art'    3    'Lambda' 
11        'Art'    8    'Lambda' 
12        'Art'    max  undefined 
13        'Art'    1    undefined 
14        'Art'    5    undefined 
Run Code Online (Sandbox Code Playgroud)

我想创建一个新列 CATEGORY_1,将 CATEGORY 值(其中 GRADE 为最大值)广播到它们各自的 CLASS 组。请参阅下面的结果 df。

STUD_ID   CLASS   GRADE  CATEGORY CATEGORY_1
1         'Sci'    max  'Alpha' .   'Alpha'
2         'Sci'    7 …
Run Code Online (Sandbox Code Playgroud)

python pandas

3
推荐指数
1
解决办法
338
查看次数

熊猫vs PEP样式指南

熊猫矢量化方法允许在一行中执行很多操作,从而导致比平时更长的行。如何将PEP准则与熊猫长行调和?

PEP建议python的最大行长度不应大于72。

熊猫线可以是这样的:

df['VALUE_EXPRESSED'] = np.where((df['TEST_HOSPITAL_CONCEPT_NAME_CLEAN']=='EO AUTOMATED ABS') & (df['UNIT_AS_EXPECTED']=='cells/mcl'),df['VALUE_EXPRESSED']*1000,df['VALUE_EXPRESSED'] )
Run Code Online (Sandbox Code Playgroud)

要么

query = df.groupby(['TEST_HOSPITAL_CONCEPT_NAME_CLEAN', 'UNIT_AS_EXPECTED_TRANSFORMED', 'NUMERATOR','DENOMINATOR']).size().reset_index(name='COUNT')
Run Code Online (Sandbox Code Playgroud)

我无法修改标题名称,并且我认为使用变量来缩短名称将使代码不太明确且难以阅读。

python pandas

2
推荐指数
1
解决办法
113
查看次数

标签 统计

pandas ×8

python ×8

dataframe ×1

pytest ×1

testing ×1