我有一个文件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) 我有一个带有数字的 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) 我有一个具有定义的列结构的大型数据集,我为其构建了一个脚本/管道,通常执行以下操作:首先,摄取数据(格式化、清理等),其次,它转换值并创建一个新列这些新的转换值(最终结果)或多或少像这样:
我的脚本分为两个文件(每个文件约 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) 我有一个数据框和一个字典:
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 …
我正在尝试使用以编程方式创建的 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 更方便自动化。另外,我可以确保输出列的顺序。
我有一个包含以下列的数据框(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('.') 但科学记数法不喜欢它。注意:我有一个很大的数据集,要浏览科学计数法的位置并不容易。
数据框:
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) 熊猫矢量化方法允许在一行中执行很多操作,从而导致比平时更长的行。如何将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)
我无法修改标题名称,并且我认为使用变量来缩短名称将使代码不太明确且难以阅读。