私信  •  关注

unutbu

unutbu 最近创建的主题
unutbu 最近回复了
12 年前
回复了 unutbu 创建的主题 » Python-检查缩写的时区字符串是否有效[重复]

你可以列出所有可用的时区 pytz.all_timezones :

In [40]: import pytz
In [41]: pytz.all_timezones
Out[42]: 
['Africa/Abidjan',
 'Africa/Accra',
 'Africa/Addis_Ababa',
 ...]

还有 pytz.common_timezones :

In [45]: len(pytz.common_timezones)
Out[45]: 403

In [46]: len(pytz.all_timezones)
Out[46]: 563

一种情况下,它对 os.path.join('a', '/b') 归来 /b 如果你向用户索要文件名。

用户可以输入相对于当前目录的路径,也可以输入完整路径,您的程序可以这样处理这两种情况:

os.path.join(os.getcwd(), filename)

In [54]: os.getcwd()
Out[54]: '/tmp'

In [55]: os.path.join(os.getcwd(), 'foo')
Out[55]: '/tmp/foo'

In [56]: os.path.join(os.getcwd(), '/foo/bar')
Out[56]: '/foo/bar'

str.strip 为此:

In [1]: import string

In [4]: '123foo456'.strip(string.digits)
Out[4]: 'foo'

In [5]: '2foo1c#BAR'.strip(string.digits)
Out[5]: 'foo1c#BAR'

正如马特在评论中指出的(谢谢,马特),这只会删除数字。要删除任何非字母字符,

定义非字母的含义:

In [22]: allchars = string.maketrans('', '')

In [23]: nonletter = allchars.translate(allchars, string.letters)

然后脱掉衣服:

In [18]: '2foo1c#BAR'.strip(nonletter)
Out[18]: 'foo1c#BAR'
11 年前
回复了 unutbu 创建的主题 » Python帮助-设置x限制的间隔[duplicate]

您可以显式地设置要在其中打勾的标记 plt.xticks :

plt.xticks(np.arange(min(x), max(x)+1, 1.0))

例如,

import numpy as np
import matplotlib.pyplot as plt

x = [0,5,9,10,15]
y = [0,1,2,3,4]
plt.plot(x,y)
plt.xticks(np.arange(min(x), max(x)+1, 1.0))
plt.show()

np.arange 使用的而不是Python的 range 以防万一 min(x) max(x) 是浮点数而不是整数。)


plt.plot (或 ax.plot x y ax.get_xlim() 以发现Matplotlib已经设置了哪些限制。

start, end = ax.get_xlim()
ax.xaxis.set_ticks(np.arange(start, end, stepsize))

ax.xaxis.set_major_formatter(ticker.FormatStrFormatter('%0.1f'))

下面是一个可运行的示例:

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.ticker as ticker

x = [0,5,9,10,15]
y = [0,1,2,3,4]
fig, ax = plt.subplots()
ax.plot(x,y)
start, end = ax.get_xlim()
ax.xaxis.set_ticks(np.arange(start, end, 0.712123))
ax.xaxis.set_major_formatter(ticker.FormatStrFormatter('%0.1f'))
plt.show()
11 年前
回复了 unutbu 创建的主题 » 如何在pandas python中为字符串创建汇总列[duplicate]

你的问题有点模棱两可。至少有 两种解释:

  1. 钥匙在 di 参考索引值
  2. 钥匙在 参照 df['col1'] 价值观
  3. 钥匙在 参考索引位置(不是OP的问题,而是为了好玩而抛出的。)

以下是每种情况的解决方案。


案例1: 如果 是指索引值,然后可以使用 update 方法:

df['col1'].update(pd.Series(di))

例如,

import pandas as pd
import numpy as np

df = pd.DataFrame({'col1':['w', 10, 20],
                   'col2': ['a', 30, np.nan]},
                  index=[1,2,0])
#   col1 col2
# 1    w    a
# 2   10   30
# 0   20  NaN

di = {0: "A", 2: "B"}

# The value at the 0-index is mapped to 'A', the value at the 2-index is mapped to 'B'
df['col1'].update(pd.Series(di))
print(df)

产量

  col1 col2
1    w    a
2    B   30
0    A  NaN

我修改了你原帖中的值,这样就更清楚了 更新 正在做。 注意钥匙是如何进入的 与索引值关联。索引值的顺序——即,索引 位置 --没关系。


案例2: 如果钥匙在 参照 DF[COL1′] 值,然后@danallan和@dsm显示如何使用 replace :

import pandas as pd
import numpy as np

df = pd.DataFrame({'col1':['w', 10, 20],
                   'col2': ['a', 30, np.nan]},
                  index=[1,2,0])
print(df)
#   col1 col2
# 1    w    a
# 2   10   30
# 0   20  NaN

di = {10: "A", 20: "B"}

# The values 10 and 20 are replaced by 'A' and 'B'
df['col1'].replace(di, inplace=True)
print(df)

产量

  col1 col2
1    w    a
2    A   30
0    B  NaN

注意,在这种情况下,如何在 已更改为匹配 价值观 在里面 DF[COL1′] .


案例3: 如果钥匙在 参考索引位置,然后可以使用

df['col1'].put(di.keys(), di.values())

自从

df = pd.DataFrame({'col1':['w', 10, 20],
                   'col2': ['a', 30, np.nan]},
                  index=[1,2,0])
di = {0: "A", 2: "B"}

# The values at the 0 and 2 index locations are replaced by 'A' and 'B'
df['col1'].put(di.keys(), di.values())
print(df)

产量

  col1 col2
1    A    a
2   10   30
0    B  NaN

在这里,第一行和第三行被修改了,因为 0 2 ,它使用python基于0的索引引用第一个和第三个位置。

14 年前
回复了 unutbu 创建的主题 » 最令人沮丧的python黑客是什么?

使用 eval exec 对用户输入可能是最常见的滥用python特性。

要选择列值等于标量的行, some_value 使用 == :

df.loc[df['column_name'] == some_value]

要选择列值在ITerable中的行, some_values 使用 isin :

df.loc[df['column_name'].isin(some_values)]

将多个条件与 & :

df.loc[(df['column_name'] >= A) & (df['column_name'] <= B)]

注意括号。因为巨蟒的 operator precedence rules , & 绑得更紧 <= >= . 因此,最后一个例子中的括号是必要的。没有括号

df['column_name'] >= A & df['column_name'] <= B

被分析为

df['column_name'] >= (A & df['column_name']) <= B

结果是 Truth value of a Series is ambiguous error .


选择其列值的行 不等于 一些价值 使用 != :

df.loc[df['column_name'] != some_value]

伊辛 返回布尔序列,以便选择值为 在里面 一些价值观 ,使用 ~ :

df.loc[~df['column_name'].isin(some_values)]

例如,

import pandas as pd
import numpy as np
df = pd.DataFrame({'A': 'foo bar foo bar foo bar foo foo'.split(),
                   'B': 'one one two three two two one three'.split(),
                   'C': np.arange(8), 'D': np.arange(8) * 2})
print(df)
#      A      B  C   D
# 0  foo    one  0   0
# 1  bar    one  1   2
# 2  foo    two  2   4
# 3  bar  three  3   6
# 4  foo    two  4   8
# 5  bar    two  5  10
# 6  foo    one  6  12
# 7  foo  three  7  14

print(df.loc[df['A'] == 'foo'])

产量

     A      B  C   D
0  foo    one  0   0
2  foo    two  2   4
4  foo    two  4   8
6  foo    one  6  12
7  foo  three  7  14

如果要包含多个值,请将它们放入 列出(或更一般地说,任何一个都可以)并使用 伊辛 :

print(df.loc[df['B'].isin(['one','three'])])

产量

     A      B  C   D
0  foo    one  0   0
1  bar    one  1   2
3  bar  three  3   6
6  foo    one  6  12
7  foo  three  7  14

但是,请注意,如果您希望多次这样做,那么 先做一个索引,然后使用 df.loc :

df = df.set_index(['B'])
print(df.loc['one'])

产量

       A  C   D
B              
one  foo  0   0
one  bar  1   2
one  foo  6  12

或者,要包含索引中的多个值,请使用 df.index.isin :

df.loc[df.index.isin(['one','two'])]

产量

       A  C   D
B              
one  foo  0   0
one  bar  1   2
two  foo  2   4
two  foo  4   8
two  bar  5  10
one  foo  6  12