我一直在寻找应用函数的最佳方法,该函数采用多个单独的 Pandas DataFrame 列并在同一个所述 DataFrame 中输出多个新列。假设我有以下内容:
def apply_func_to_df(df):
df[['new_A', 'new_B']] = df.apply(lambda x: transform_func(x['A'], x['B'], x['C']), axis=1)
def transform_func(value_A, value_B, value_C):
# do some processing and transformation and stuff
return new_value_A, new_value_B
Run Code Online (Sandbox Code Playgroud)
我正在尝试将此函数如上所示应用于整个 DataFrame df,以便输出 2 个新列。但是,这可以推广到接受nDataFrame 列并将m新列输出到同一 DataFrame 的用例/函数。
以下是我一直在关注的事情(取得了不同程度的成功):
transform_func以显式期望行(即字段)A, B,C如下所示,然后对 df 进行 apply:def transform_func_mod(df_row):
# do something with df_row['A'], df_row['B'], df_row['C]
return new_value_A, new_value_B
Run Code Online (Sandbox Code Playgroud)
我想要一种非常通用和 Pythonic 的方法来完成这项任务,同时考虑性能(内存和时间方面)。我将不胜感激对此的任何意见,因为由于我对 Pandas 不熟悉,我一直在努力解决这个问题。
我有一个字典,我想使用 .get() 方法检索一些值,如果键不存在,则应执行返回正确值的默认函数,但仅当键不存在时才应执行展示。
我尝试删除默认值并且它有效,那么为什么即使不使用该函数也会执行它?
SQL 查询不会返回任何内容,因为它只包含字典中尚未存在的值
def get_port():
def default():
cursor.execute("SELECT port FROM table WHERE server=%s LIMIT 1",(server_name,))
return cursor.fetchone()[0]
port = {
'server1': 2222,
'server2': 2223,
'server3': 2224
}
#print(port.get(server_name)) << Works
return port.get(server_name, default())
Run Code Online (Sandbox Code Playgroud)
错误:
返回cursor.fetchone()[0] TypeError:“NoneType”对象不可下标
我希望默认函数仅在密钥不存在时执行。
我有一个字符串列表,如果它们的结尾不是“。”,我想将它们串联起来。
my_list=["This is my first string.","This is my second string, ","this is the middle of my second string","and this is the end of my second string."]
for index in range(len(my_list)):
text=my_list[index]:
if not text.endswith("."):
Run Code Online (Sandbox Code Playgroud)
预期
["This is my first string.","This is my second string, this is the middle of my second string and this is the end of my second string"]
我有一个DataFrame df,其中有一个整数列“ X”
df = pd.DataFrame({'X': [7, 2, 0, 3, 4, 2, 5, 0, 3, 4]})
Run Code Online (Sandbox Code Playgroud)
我需要计算df中每个值到前一个零的距离。
所以预期的输出将是
op = pd.DataFrame({'dist': [0 ,0, 0, 1, 2, 3, 4, 0, 1, 2]})
Run Code Online (Sandbox Code Playgroud)
我能够做一个for循环并实现逻辑,但是我想我有一种更pythonic的方式来做,而我却错过了。
给定一个数据帧df1,如下所示:
Col1 Col2 Col3 Col4 Col5
-------------------------------------
A 1 AA 10 Test1
A 1 AA 5 Test2
A 2 AB 30 Test3
B 4 FF 10 Test4
C 1 HH 4 Test7
C 3 GG 6 Test8
C 3 GG 7 Test9
D 1 AA 4 Test5
D 3 FF 6 Test6
Run Code Online (Sandbox Code Playgroud)
我想按Col1,Col2和Col3分组
添加新列数:每个组的大小
添加新列Col4_sum:每个组中每个Col4的总和
输出需求
Col1 Col2 Col3 Count Col4_sum
----------------------------------------
A 1 AA 2 15
A 2 AB 1 30
B 4 FF 1 10
C 1 HH …Run Code Online (Sandbox Code Playgroud) Pandas 版本0.23.4,python 版本3.7.1
我有一个数据框 df 如下
df = pd.DataFrame([[0.1, 2, 55, 0,np.nan],
[0.2, 4, np.nan, 1,99],
[0.3, np.nan, 22, 5,88],
[0.4, np.nan, np.nan, 4,77]],
columns=list('ABCDE'))
A B C D E
0 0.1 2.0 55.0 0 NaN
1 0.2 4.0 NaN 1 99.0
2 0.3 NaN 22.0 5 88.0
3 0.4 NaN NaN 4 77.0
Run Code Online (Sandbox Code Playgroud)
我想替换列中的 Na 值B和C列“A”中的值。
预期输出是
A B C D E
0 0.1 2.0 55.0 0 NaN
1 0.2 4.0 0.2 …Run Code Online (Sandbox Code Playgroud) 尝试批量分析一个充满.csv文件的文件夹,然后根据.csv名称再次将其保存。但是,我在提取文件名并将其分配给数据帧(df)时遇到了麻烦。
import glob
import pandas as pd
path = r'csv_in'
allFiles = glob.glob(path + '/*.csv')
for file_ in allFiles:
df = pd.read_csv(file_, header=0)
df.name = file_
print(df.name)
Run Code Online (Sandbox Code Playgroud)
我得到的打印结果是“ csv_in / *。csv”。
我正在寻找的结果只是csv名称“ * .csv”
我有 df 列,由 +ve 和 -ve 列组成。
A B
0 a 5
1 b -13
2 c 15
3 d -10
Run Code Online (Sandbox Code Playgroud)
有没有办法对 +ve 值升序和 -ve 值降序进行排序
A B
0 a 5
1 c 15
2 d -10
3 b -13
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 selenium 从网站下载 pdf 文件,但我能够打开文件,但不能使用代码自动下载。
代码:
chrome_profile = webdriver.ChromeOptions()
profile = {"download.default_directory": "C:\Users\Downloads",
"download.prompt_for_download": False,
"download.directory_upgrade": True,
"plugins.plugins_disabled": ["Chrome PDF Viewer"]}
chrome_profile.add_experimental_option("prefs", profile)
Run Code Online (Sandbox Code Playgroud)
请建议。先感谢您
我需要遍历数据框行中的列,以找到第一个完全大写的单元格(在此给定的行中)。我需要对数据帧中的所有行重复此操作,最后输出一个数据帧,其中包含一列,每一行都具有相应的第一个大写字符串。
举个例子-这可能是输入数据框:
+-----+--------+--------+--------+------+
| 0 | 1 | 2 | 3 | 4 |
+-----+--------+--------+--------+------+
| a | Amount | SEQ | LTOTAL | None |
| BBc | LCALC | None | None | None |
| c | LCALC | None | None | None |
| Dea | RYR | LTOTAL | None | None |
+-----+--------+--------+--------+------+
Run Code Online (Sandbox Code Playgroud)
我需要在单独的数据框中输出以下内容:
+-------+
| SEQ |
| LCALC |
| LCALC |
| RYR |
+-------+
Run Code Online (Sandbox Code Playgroud) 所以在这里我试图将字符串' ABcsad f!,'转换为
string 'abcsadf',所以基本上我正在尝试将空格和非alpha替换为'',但是我的代码根本不起作用...
s = ' ABcsad f!,'
def norm(s):
b=''
i=0
for i in range(0,len(s)+1):
if (s[i].isalpha() is False) or (s[i].isspace() is False) :
return b+=''
else:
return b+=s[i]
i = i+1
print(norm(s))
Run Code Online (Sandbox Code Playgroud)
谁能告诉我我哪里出了问题?
我正在从美国系统获取数据。我在CSV中得到的数字是字符串“(100)”,我必须将其转换为-100整数。我在数据框中有N个列,我必须对所有列都这样做。
我现在正在做的是将所有括号替换为空和负值符号。这不是最佳解决方案,因为它正在转换数据帧中的所有给定值。
import pandas as pd
df=pd.read_csv('American.csv', thousands=r',')
df=df.apply(lambda z: z.astype(str).str.replace(')',''))
df=df.apply(lambda z: z.astype(str).str.replace('(','-'))
Run Code Online (Sandbox Code Playgroud)
我的期望:
"(100)" -> -100
"Nick (Jones)" ->"Nick **(Jones)**"
Run Code Online (Sandbox Code Playgroud)
我得到的是:
"(100)" -> -100
"Nick (Jones)" ->"Nick **-Jones**"
Run Code Online (Sandbox Code Playgroud)
我需要一个代码,用所有列的数字进行必要的转换,但又不打扰其他值。
python ×12
pandas ×8
python-3.x ×3
dataframe ×2
apply ×1
fillna ×1
for-loop ×1
glob ×1
python-2.7 ×1
selenium ×1