簡體   English   中英

使用列名稱作為pandas DataFrame上何處的條件

[英]use column name as condition for where on pandas DataFrame

說我有以下DataFrame:

arrays = [['foo', 'foo', 'bar', 'bar'],
          ['A', 'B', 'C', 'D']]
tuples = list(zip(*arrays))          
columnValues = pd.MultiIndex.from_tuples(tuples)
df = pd.DataFrame(np.random.rand(4,4), columns = columnValues)
print(df)

             foo                 bar          
               A         B         C         D
0       0.037362  0.470010  0.315396  0.333798
1       0.339038  0.396307  0.487242  0.064883
2       0.691654  0.793609  0.044490  0.384154
3       0.605801  0.967021  0.156839  0.123816

我想產生以下輸出:

             foo                 bar          
               A         B         C         D
0              0         0  0.315396  0.333798
1              0         0  0.487242  0.064883
2              0         0  0.044490  0.384154
3              0         0  0.156839  0.123816

我想我可以pd.DataFrame.where()使用pd.DataFrame.where() ,但是我沒有看到如何將列名bar作為條件傳遞。

編輯:我正在尋找一種方法來專門使用bar而不是foo來產生所需的結果,因為foo實際上將有很多列

EDIT2:不幸的是,如果列表包含所有列標簽,則列表理解會中斷。 顯式寫出for循環確實可以。 所以代替這個:

df.loc[:,  [col for col in df.columns.levels[0] if col != 'bar']] = 0 

我用這個:

for col in df.columns.levels[0]:
    if not(col in nameList):
        df.loc[:,col]=0

使用切片來設置數據。 在這里,您可以訪問foo下的子列(A,B)。

In [12]: df
Out[12]:
        foo                 bar
          A         B         C         D
0  0.040251  0.119267  0.170111  0.582362
1  0.978192  0.592043  0.515702  0.630627
2  0.762532  0.667234  0.450505  0.103858
3  0.871375  0.397503  0.966837  0.870184

In [13]: df.loc[:, 'foo'] = 0

In [14]: df
Out[14]:
  foo          bar
    A  B         C         D
0   0  0  0.170111  0.582362
1   0  0  0.515702  0.630627
2   0  0  0.450505  0.103858
3   0  0  0.966837  0.870184

如果要設置除bar之外的所有列,可以這樣做。

In [15]: df.loc[:,  [col for col in df.columns.levels[0] if col != 'bar']] = 0

您可以使用get_level_values ,我想:

>>> df
        foo                 bar          
          A         B         C         D
0  0.039728  0.065875  0.825380  0.240403
1  0.617857  0.895751  0.484237  0.506315
2  0.332381  0.047287  0.011291  0.346073
3  0.216224  0.024978  0.834353  0.500970
>>> df.loc[:, df.columns.get_level_values(0) != "bar"] = 0
>>> df
  foo          bar          
    A  B         C         D
0   0  0  0.825380  0.240403
1   0  0  0.484237  0.506315
2   0  0  0.011291  0.346073
3   0  0  0.834353  0.500970

df.columns.droplevel(1) != "bar"也應該起作用,盡管我不喜歡它,盡管它更短,因為它會反轉選擇邏輯。

更容易,無需定位

df ['foo'] = 0

如果您碰巧沒有此多重索引,則可以使用:

df.ix[:,['A','B']] = 0

這將自動將列“ A”和“ B”中的值替換為0。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM