在pandas中为列名使用变量名

时间:2016-08-09 23:21:30

标签: pandas filter

我已经搜索了几天而没有找到答案...我正在尝试根据有条件地测试的变量列名来减少数据帧的副本。

这是代码:

import pandas as pd

d = {'a':[1, 2, 3, 22, None], 
     'b':[4, None, 6, None, 33],
     'c':[7, 8, None, None, None],
     'd':[10, 110, 12, 250, 35],
     'e':[None, None, None, 26, None],
     'f':[16, None, 20, 39, 62],
     'g':[19, 20, 21, None, None]}

df = pd.DataFrame(d)
print(df)
print('\n')

df2 = pd.DataFrame()
df2 ['count'] = df.count()
df2 = df2.sort_values(by='count', ascending = False)
print(df2)
print('\n')

first_var = df2.index[0]
print(first_var)
print('\n')

df3 = pd.DataFrame() 
df3 = df.copy()

# this line gives the entire df, not d values under 100
df3[df3[first_var] < 100]

# this line crashes
# df3[df.first_var < 100]

print(df3)

这是输出:

    a   b   c    d   e   f   g
0   1   4   7   10 NaN  16  19
1   2 NaN   8  110 NaN NaN  20
2   3   6 NaN   12 NaN  20  21
3  22 NaN NaN  250  26  39 NaN 
4 NaN  33 NaN   35 NaN  62 NaN


count
d      5
a      4
f      4
b      3
g      3
c      2
e      1


d


    a   b   c    d   e   f   g
0   1   4   7   10 NaN  16  19
1   2 NaN   8  110 NaN NaN  20
2   3   6 NaN   12 NaN  20  21
3  22 NaN NaN  250  26  39 NaN
4 NaN  33 NaN   35 NaN  62 NaN

*****************************************

我真正想要的是这个输出:

    a   b   c    d   e   f   g
0   1   4   7   10 NaN  16  19
2   3   6 NaN   12 NaN  20  21
4 NaN  33 NaN   35 NaN  62 NaN

非常感谢任何帮助。感谢

2 个答案:

答案 0 :(得分:3)

试试这个:

  df[~(df > 100).any(axis=1)]

    a     b    c   d   e     f     g
0  1.0   4.0  7.0  10 NaN  16.0  19.0
2  3.0   6.0  NaN  12 NaN  20.0  21.0
4  NaN  33.0  NaN  35 NaN  62.0   NaN

&#34;〜&#34;返回True / False条件的反面。

如果你的数据看起来像这样:

d = {'a':[1, 2, 3, 22, 130], 
     'b':[4, None, 6, None, 33],
     'c':[7, 8, None, None, None],
     'd':[10, 110, 12, 250, 35],
     'e':[None, None, None, 26, None],
     'f':[16, None, 20, 12, 62],
     'g':[19, 20, 21, None, None]}

df = pd.DataFrame(d)
df

     a     b    c    d     e     f     g
0    1   4.0  7.0   10   NaN  16.0  19.0
1    2   NaN  8.0  110   NaN   NaN  20.0
2    3   6.0  NaN   12   NaN  20.0  21.0
3   22   NaN  NaN  250  26.0  12.0   NaN
4  130  33.0  NaN   35   NaN  62.0   NaN
    ^ added this 

Use something like this: 

df[~(df["d"] > 100)]

     a     b    c   d   e     f     g
0    1   4.0  7.0  10 NaN  16.0  19.0
2    3   6.0  NaN  12 NaN  20.0  21.0
4  130  33.0  NaN  35 NaN  62.0   NaN

答案 1 :(得分:1)

用以下代码替换整个代码:

df[df[df.count().argmax()] < 100]

基本上:

d = {'a':[1, 2, 3, 22, None], 
     'b':[4, None, 6, None, 33],
     'c':[7, 8, None, None, None],
     'd':[10, 110, 12, 250, 35],
     'e':[None, None, None, 26, None],
     'f':[16, None, 20, 39, 62],
     'g':[19, 20, 21, None, None]}

df = pd.DataFrame(d)

df[df[df.count().argmax()] < 100]

产地:

    a   b   c    d   e   f   g
0   1   4   7   10 NaN  16  19
2   3   6 NaN   12 NaN  20  21
4 NaN  33 NaN   35 NaN  62 NaN

你的方式真是太棒了!