python - Pandas : columns sample based on row value

标签 python pandas dataframe filter split

例如我有这个数据框:

 d = {'data_1' : pd.Series([1., 2., 3., 4., 1], index=['a', 'b', 'c', 'd', 'class']),
  'data_2' : pd.Series([5., 6., 7., 8., 0], index=['a', 'b', 'c', 'd', 'class']),
  'data_3' : pd.Series([9., 10., 11., 12., 1], index=['a', 'b', 'c', 'd', 'class'])}
df = pd.DataFrame(d)

所以作为输出我得到:

    data_1  data_2  data_3
a   1.0      5.0    9.0
b   2.0      6.0    10.0
c   3.0      7.0    11.0
cls 1.0      0.0    1.0

我想做的是根据“cls”行中报告的值创建一个过滤器,并根据两个可能的类别将数据帧分成两部分

    data_1  data_3
a   1.0      9.0
b   2.0      10.0
c   3.0      11.0
cls 1.0      1.0

        data_2
a        5.0
b        6.0    
c        7.0    
cls      0.0    

最佳答案

使用boolean indexing with loc - 第一个用于按条件选择所有列,第二个用于按 index 选择行:

df1 = df.loc[:, df.loc['class'] == 1]
df2 = df.loc[:, df.loc['class'] == 0]

还可以通过行class的所有唯一值创建字典:

s = df.loc['class']
dfs = {k:df[v.index] for k, v in s.groupby(s)}
print (dfs)

{0.0:        data_2
a         5.0
b         6.0
c         7.0
d         8.0
class     0.0, 1.0:        data_1  data_3
a         1.0     9.0
b         2.0    10.0
c         3.0    11.0
d         4.0    12.0
class     1.0     1.0}
<小时/>
print (list(dfs.keys()))
[0.0, 1.0]

print (dfs[0])
       data_2
a         5.0
b         6.0
c         7.0
d         8.0
class     0.0:

print (dfs[1])
       data_1  data_3
a         1.0     9.0
b         2.0    10.0
c         3.0    11.0
d         4.0    12.0
class     1.0     1.0

关于python - Pandas : columns sample based on row value,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48503346/

相关文章:

python - Pandas/Python 根据另一列的字符串值列出一列的值

Python 创建数字序列并按组附加

Python Pandas Cumsum 在多种条件下每次都会重置

python - 在exchangelib中访问 "Other Calendars"

python - 使用报纸从 HTML 中提取图像

python - PIL : Image. fromarray(img.astype ('uint8' ), mode ='RGB' ) 返回灰度图像

python - 在哪里可以找到 pandas-profiling 的配置参数?

python - 对列中每个唯一值的最后几个条目进行平均以生成新的 df

r - (R) 数据帧的 for 循环不起作用

python - 如何在 Pandas Python 中将单元格中的数字更改为单词 'Bus'