![](/img/trans.png)
[英]Column name manipulation using Pandas dataframe where no column name is present
[英]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.