我想试试applymapPandas DataFrame对象方法的功能.这是用例:
假设我的DataFrame df1如下:
Age ID Name
0 27 101 John
1 22 102 Bob
2 19 103 Alok
3 27 104 Tom
4 32 105 Matt
5 19 106 Steve
6 5 107 Tom
7 55 108 Dick
8 67 109 Harry
Run Code Online (Sandbox Code Playgroud)
现在我想创建一个标志变量,其逻辑是如果元素的长度小于2,则flag = 1 else flag = 0.
为了运行这个元素,我想使用applymap方法.为此,我创建了一个用户定义的函数,如下所示:
def f(x):
if len(str(x))>2:
df1['Flag']=1
else:
df1['Flag']=0
Run Code Online (Sandbox Code Playgroud)
然后我跑df1.applymap(f)了给了:
Age ID Name
0 None None None
1 None None None
2 None …Run Code Online (Sandbox Code Playgroud) 题
有没有办法只格式化特定的数据帧?
我已经看到了格式化单个数据帧的特定列的示例(示例1)或将整个pandas库设置为默认选项(示例2).但是,我没有看到在没有明确列出每列的情况下格式化特定数据框的选项.
建立
import pandas as pd
import numpy as np
# Setup first example
data = np.random.random((3,4))
df = pd.DataFrame(data)
print df
# 0 1 2 3
#0 0.384326 0.364187 0.084034 0.012376
#1 0.114784 0.298068 0.087634 0.828207
#2 0.255923 0.438617 0.820652 0.266964
Run Code Online (Sandbox Code Playgroud)
示例1 - 更改单个数据帧中特定列的格式
df[3] = df[3].map('${:,.2f}'.format)
print df
# 0 1 2 3
#0 0.384326 0.364187 0.084034 $0.01
#1 0.114784 0.298068 0.087634 $0.83
#2 0.255923 0.438617 0.820652 $0.27
Run Code Online (Sandbox Code Playgroud)
示例2 - 更改所有pandas数据帧的格式(包括新的)
pd.options.display.float_format = '${:,.2f}'.format
print(df)
# …Run Code Online (Sandbox Code Playgroud) def function_name(df):
for i, row in df.iterrows():
df.set_value(...)
return df
if __name__ == '__main__':
# Assume we have a dataframe called idf
idf = function_name(idf)
Run Code Online (Sandbox Code Playgroud)
在上面的代码中,我将一个名为 idf 的数据帧传递到一个名为 function_name 的函数中。在该函数中,我循环遍历数据帧中的所有行,进行一些修改并返回一个数据帧,并将其存储回 idf 中。
我有一种感觉,这种方法正在浪费内存,有人可以纠正我或指出更好的Pythonic方法吗?请注意,我有充分的理由使用 iterrows,即使它使一切变慢,我只是想要一些关于我将数据帧传递给函数并将其返回的方式的反馈
- -编辑 -
根据@marius 的反馈,我想知道的是:
通过将数据帧传递到函数中,我是否制作了数据帧的新副本?这就是我担心的内存浪费
我的 Pandas 数据框中的一列代表我用 datetime 计算的时间增量,然后导出到 csv 并读回 Pandas 数据框中。现在该列的 dtype 是 object 而我希望它是 timedelta 这样我就可以在数据帧上执行 groupby 函数。下面是字符串的样子。谢谢!
0 days 00:00:57.416000
0 days 00:00:12.036000
0 days 16:46:23.127000
49 days 00:09:30.813000
50 days 00:39:31.306000
55 days 12:39:32.269000
-1 days +22:03:05.256000
Run Code Online (Sandbox Code Playgroud)
更新,我最好尝试编写一个 for 循环来迭代我的 Pandas 数据帧中的特定列:
def delta(i):
days, timestamp = i.split(" days ")
timestamp = timestamp[:len(timestamp)-7]
t = datetime.datetime.strptime(timestamp,"%H:%M:%S") +
datetime.timedelta(days=int(days))
delta = datetime.timedelta(days=t.day, hours=t.hour,
minutes=t.minute, seconds=t.second)
delta.total_seconds()
data['diff'].map(delta)
Run Code Online (Sandbox Code Playgroud) 我有一个array像下面
np.array(["hello","world",{"a":5,"b":6,"c":8},"usa","india",{"d":9,"e":10,"f":11}])
Run Code Online (Sandbox Code Playgroud)
和pandas DataFrame下面一样
df = pd.DataFrame({'A': ["hello","world",{"a":5,"b":6,"c":8},"usa","india",{"d":9,"e":10,"f":11}]})
Run Code Online (Sandbox Code Playgroud)
当我申请np.isreal到DataFrame
df.applymap(np.isreal)
Out[811]:
A
0 False
1 False
2 True
3 False
4 False
5 True
Run Code Online (Sandbox Code Playgroud)
当我np.isreal为numpy阵列做的时候.
np.isreal( np.array(["hello","world",{"a":5,"b":6,"c":8},"usa","india",{"d":9,"e":10,"f":11}]))
Out[813]: array([ True, True, True, True, True, True], dtype=bool)
Run Code Online (Sandbox Code Playgroud)
我必须使用np.isreal错误的用例,但是你能帮我解释为什么结果不同吗?
我有一只熊猫df,那里df['value']有一系列的花车。
df['is_it_whole'][i]其值1(或True)被相应的df['value'][i]是一个整数,0或False以其他方式。df['is_it_whole'] = df['value'].is_integer()但熊猫系列不支持该is_integer方法,我正在寻找类似的方法。建议?
我使用Pandas导入了CSV,并使用字符串条目读入了一列.检查本系列(列)的条目,我发现它们实际上应该是列表.例如:
df['A'] = pd.Series(['["entry11"]', '["entry21","entry22"]', '["entry31","entry32"]'])
Run Code Online (Sandbox Code Playgroud)
我想从字符串中提取列表元素.到目前为止,我已经尝试了以下链:
df['A'] = df['A'].replace("'",'',regex=True).
replace('\[','',regex=True).
replace('\]','',regex=True).
str.split(",")
Run Code Online (Sandbox Code Playgroud)
(当然,所有在一条线上).
这让我在一列中找回了我想要的列表元素.
我的问题:有没有更有效的方法呢?对于应该更容易一些的东西来说,这似乎很紧张.
我有多个简单的函数需要在我的数据帧的某些列的每一行上实现.数据帧很像,1000万+行.我的数据框是这样的:
Date location city number value
12/3/2018 NY New York 2 500
12/1/2018 MN Minneapolis 3 600
12/2/2018 NY Rochester 1 800
12/3/2018 WA Seattle 2 400
Run Code Online (Sandbox Code Playgroud)
我有这样的功能:
def normalized_location(row):
if row['city'] == " Minneapolis":
return "FCM"
elif row['city'] == "Seattle":
return "FCS"
else:
return "Other"
Run Code Online (Sandbox Code Playgroud)
然后我用:
df['Normalized Location'] =df.apply (lambda row: normalized_location (row),axis=1)
Run Code Online (Sandbox Code Playgroud)
这非常慢,我怎样才能提高效率呢?
我正在尝试制作一个Python程序,它将根据公式、给定因素和输入数据帧计算结果。
N_cars我在给定的道路长度 ( ) 上有许多汽车 ( l) 及其平均速度 ( v):
input_columns = ['l', 'N_cars', 'v']
input_data = [[3.5, 1000, 100], [5.7, 500, 110],
[10, 367, 110], [11.1, 1800, 95],
[2.8, 960, 105], [4.7, 800, 120],
[10.4, 103, 111], [20.1, 1950, 115]]
input_df = pd.DataFrame(input_data, columns=input_columns)
input_df
l N_cars v
0 3.5 1000 100
1 5.7 500 110
2 10.0 367 110
3 11.1 1800 95
4 2.8 960 105
5 4.7 800 120
6 10.4 103 111 …Run Code Online (Sandbox Code Playgroud) 谁能解释一下为什么这段代码不起作用?
wordsCount = {}
def addWord(x):
print(x)
df.apply(addWord(x))
Run Code Online (Sandbox Code Playgroud)
它返回错误: TypeError: ("'NoneType' object is not callable", 'occurred at index 0') 数据帧 df 在某些单元格中包含一些 None 值。我的意图是将函数应用于所有非 None 值。
在我的代码中,我使用 df.style.applymap() 将 HTML 呈现到我的 Intranet 网页上。我有以下代码对我来说效果很好(2 列被传递给我的函数 highlight_vals)。
def highlight_vals(val, color='green', color1='red'):
if val > 0.8:
return 'background-color: %s' % color
elif val < -0.9:
return 'background-color: %s' % color1
else:
return ''
Run Code Online (Sandbox Code Playgroud)
现在,我想制作一个类似的函数(或曾经使用当前的 highlight_vals),以便在以下行的条件下实现比较突出显示:
if ValinColumn1 > 0.25 * ValinColumn2: # (For same Row/Record)
return 'background-颜色:%s' % 颜色 #黄色/高光。
我在我的views.py 中使用了上面的函数:
httresp += df.style.applymap(highlight_vals,subset=[col1,col2])
我正在尝试将lambda与if-else条件应用于pandas df df如下所示:
col1 col2 col3 col4 <---column names
None None None col4 <---column values in str
col1 None None None
None col2 None None
df_twitter_archive_master[['col1','col2','col3','col4']].apply(lambda x: x=0 if x=='None' else x=1)
Run Code Online (Sandbox Code Playgroud)
基本上,它应该用0替换'None'值,否则用1替换但是我一直得到这个错误
df_twitter_archive_master[['col1','col2','col3','col4']].apply(lambda x: x=0 if x=='None' else x=1)
SyntaxError: invalid syntax
Run Code Online (Sandbox Code Playgroud)
^在x = 1下
我究竟做错了什么??
如果我有一个带有两个值的变量(例如,性别可以是男性或女性),我会使用类似的代码,
train_df["Sex"] = train_df["Sex"].apply(lambda sex: 0 if sex == 'male' else 1)
Run Code Online (Sandbox Code Playgroud)
将字符串转换为整数。如果变量采用 2 个以上的值,例如分类为低/中/高的薪水,有什么方法可以做到?如何像上面一样赋值?