我有一个数据帧
0 1 2 3 Marketcap
0 1.707280 0.666952 0.638515 -0.061126 2.291747 1.71B
1 -1.017134 1.353627 0.618433 0.008279 0.148128 1.82B
2 -0.774057 -0.165566 -0.083345 0.741598 -0.139851 1.1M
3 -0.630724 0.250737 1.308556 -1.040799 1.064456 30.92M
4 2.029370 0.899612 0.261146 1.474148 -1.663970 476.74k
5 2.029370 0.899612 0.261146 1.474148 -1.663970 -1
是否有某种自定义筛选方法,可以让Python知道
说我要过滤,df[df.市场资本
非常感谢。
编辑:重新打开线程作为Max U的答案,而优秀似乎产生了一个熊猫bug,我们在Github上打开了一个问题。
更新:
In [44]: df
Out[44]:
0 1 2 3 4 Marketcap
0 1.707280 0.666952 0.638515 -0.061126 2.291747 1.71B
1 -1.017134 1.353627 0.618433 0.008279 0.148128 1.82B
2 -0.774057 -0.165566 -0.083345 0.741598 -0.139851 1.1M
3 -0.630724 0.250737 1.308556 -1.040799 1.064456 30.92M
4 2.029370 0.899612 0.261146 1.474148 -1.663970 476.74k
5 2.029370 0.899612 0.261146 1.474148 -1.663970 -1
In [45]: df[pd.eval(df.Marketcap.replace(['[Kk]','[Mm]','[Bb]'],
['*10**3','*10**6','*10**9'], regex=True) \
.add(' < 35*10**6'))]
Out[45]:
0 1 2 3 4 Marketcap
2 -0.774057 -0.165566 -0.083345 0.741598 -0.139851 1.1M
3 -0.630724 0.250737 1.308556 -1.040799 1.064456 30.92M
4 2.029370 0.899612 0.261146 1.474148 -1.663970 476.74k
5 2.029370 0.899612 0.261146 1.474148 -1.663970 -1
我会这样做:
In [13]: df[pd.eval(df.Marketcap.replace(['M','B'],['','*1000'], regex=True).add(' > 35'))]
Out[13]:
0 1 2 3 4 Marketcap
0 1.707280 0.666952 0.638515 -0.061126 2.291747 1.71B
1 -1.017134 1.353627 0.618433 0.008279 0.148128 1.82B
4 2.029370 0.899612 0.261146 1.474148 -1.663970 100.9M
说明:
In [14]: df.Marketcap.replace(['M','B'],['','*1000'], regex=True)
Out[14]:
0 1.71*1000
1 1.82*1000
2 1.1
3 30.92
4 100.9
Name: Marketcap, dtype: object
In [15]: df.Marketcap.replace(['M','B'],['','*1000'], regex=True).add(' > 35')
Out[15]:
0 1.71*1000 > 35
1 1.82*1000 > 35
2 1.1 > 35
3 30.92 > 35
4 100.9 > 35
Name: Marketcap, dtype: object
In [16]: pd.eval(df.Marketcap.replace(['M','B'],['','*1000'], regex=True).add(' > 35'))
Out[16]: array([True, True, False, False, True], dtype=object)
资料来源:
In [176]: df
Out[176]:
0 1 2 3 Market Cap
0 1.707280 0.666952 0.638515 -0.061126 2.291747 1.71B
1 -1.017134 1.353627 0.618433 0.008279 0.148128 1.82B
2 -0.774057 -0.165566 -0.083345 0.741598 -0.139851 1.1M
3 -0.630724 0.250737 1.308556 -1.040799 1.064456 30.92M
4 2.029370 0.899612 0.261146 1.474148 -1.663970 476.74k
5 2.029370 0.899612 0.261146 1.474148 -1.663970 -1
解决方案:
to_replace = ['\d+\s*[Kk]','\d+\s*[Mm]','\d+\s*[Bb]', '-1', 'N/A']
value = [1000,1000000,1000000000, 1, 1]
mask = df.assign(
f=df['Market Cap'].replace(to_replace, value, regex=True),
Marketcap=pd.to_numeric(df['Market Cap'].str.replace(r'[^\d\.]', ''), errors='coerce')
).eval("Marketcap * f < 35000000")
df[mask]
结果:
In [178]: df[mask]
Out[178]:
0 1 2 3 Market Cap
2 -0.774057 -0.165566 -0.083345 0.741598 -0.139851 1.1M
3 -0.630724 0.250737 1.308556 -1.040799 1.064456 30.92M
4 2.029370 0.899612 0.261146 1.474148 -1.663970 476.74k
5 2.029370 0.899612 0.261146 1.474148 -1.663970 -1
PS如果要在结果数据集更改中保留非数值(如N/A
):
pd.to_numeric(df['Market Cap'].str.replace(r'[^\d\.]', ''), errors='coerce')
到
pd.to_numeric(df['Market Cap'].str.replace(r'[^\d\.]', ''), errors='coerce').fillna('0')
这不是超级干净,但它做到了,不使用任何python迭代:
代码:
# Create a separate column (which you can omit later) that converts 'Marketcap' strings to numbers
df['cap'] = df.loc[df['Marketcap'].str.contains('B'), 'Marketcap'].str.replace('B','').astype(float) * 1000
df['cap'].fillna(df.loc[df['Marketcap'].str.contains('M'), 'Marketcap'].str.replace('M',''), inplace = True)
# For pandas pre-0.20.0 (<May 2017)
print df.ix[df['cap'].astype(float) > 35, :-1]
# For pandas 0.20.0+ (.ix[] deprecated)
print df.iloc[df[df['cap'].astype(float) > 35].index, :-1]
# Or, alternate pandas 0.20.0+ option (thanks @Psidom)
print df[df['cap'].astype(float) > 35].iloc[:,:-1]
输出:
0 1 2 3 4 Marketcap
0 1.707280 0.666952 0.638515 -0.061126 2.291747 1.71B
1 -1.017134 1.353627 0.618433 0.008279 0.148128 1.82B
4 2.029370 0.899612 0.261146 1.474148 -1.663970 100.9M
问题内容: 阅读完之后:http : //pandas.pydata.org/pandas- docs/version/0.13.1/genic/pandas.DataFrame.sort.html 我似乎仍然无法弄清楚如何通过自定义列表对列进行排序。显然,默认排序是字母顺序的。我举一个例子。这是我的(非常删节的)数据帧: 我希望能够按播放器,年份和Tm进行排序。按玩家和年份的默认排序对我来说是正
问题内容: 我有python pandas dataframe,其中一列包含月份名称。 如何使用字典进行自定义排序,例如: 问题答案: 熊猫0.15引入了“分类系列”,该分类系列提供了一种更清晰的方法: 首先,将月份列设为分类,然后指定要使用的顺序。 现在,当您对月份列进行排序时,它将相对于该列表进行排序: 注意:如果值不在列表中,它将被转换为NaN。 对于那些有兴趣的人来说,是一个较旧的答案。
问题内容: 所以我有一个像这样的DataFrame: 我们可以像这样对它进行布尔索引 我们还可以通过行标签将其切片,如下所示: 我想同时执行这两个操作(因此,避免只做行标签过滤器而不必要地复制)。我将如何去做? 我要寻找的伪代码: 问题答案: 您几乎拥有它:
问题内容: 为什么不像天真的预期那样起作用? (输出为) 问题答案: 为了与Python 2-3兼容,只需将其添加到示例中: 或将Foo的原始定义扩展为包括: 当然,您也可以反过来定义它们,方法名称在哪里,然后将其分配给,但是我认为该名称只是Python根据其与对象的等价性将对象解释为真或假的原始C- ishness的遗产。零。只需添加上面的语句,您的代码即可在Python 2.x上运行,并且在升
我试图合并两个数据帧,条件是key1包含key2,下面是一个示例 我在key'name'列上进行合并,我想要得到的结果是 在我的例子中,df1相对较小,大约有600条记录,但df2相当大,大约有200万条记录,所以效率也是一个问题,非常感谢。
我有一个熊猫数据框,大约有50列和