基于另一个索引值修改数据帧索引中的值

2024-10-03 06:22:53 发布

您现在位置:Python中文网/ 问答频道 /正文

我对熊猫还不熟悉,也不熟悉指数,尤其是多重指数。我有这样一个数据帧:

df = pd.DataFrame({
    'ID':[1,2,1,2],
    'Measurement': ['ScanA', 'ScanA', 'ScanB', 'ScanB'],
    'Result':[0.1,0.2,0.5,0.7],
    'ResultType':['A','B','C','B']})
piv = df.pivot(index = 'ID', columns = 'Measurement', values = ['Result', 'ResultType'])

这将创建两个索引ResultType,但是我想基于Type值修改Result索引中的值。你知道吗

例如,如果Type == 'C',那么我希望相应的Result-1。你知道吗

另一个例子是如果Type in ('A', 'B'),那么我想将Result设置为0 if < 0.5 else 1

我如何在不循环每一行/每一列的情况下以编程的方式做到这一点?你知道吗

piv.Result的输出如下所示:

Measurement     ScanA   ScanB
ID      
1               0.0     -1
2               0.0     1

Tags: 数据iddataframedfindextyperesult指数
3条回答

pandas库中有一个名为loc()的方法,允许用户通过调用行的标签来查找行的值。此函数以及pandas提供的条件选择允许用户查找某些条件为真的行(类似于SQL中的WHERE功能),并为该行中的其他列设置值。使用这些方法,我在代码中添加了一部分,将'Result'列设置为-1'Type' == 'A'。可以基于'Type'值应用相同的结构来更改其他'Result'行。你知道吗

df = pd.DataFrame({
    'ID':[1,2,1,2],
    'Measurement': ['ScanA', 'ScanA', 'ScanB', 'ScanB'],
    'Result':[0.1,0.2,0.5,0.7],
    'Type':['A','B','A','C']})
piv = df.pivot(index = 'ID', columns = 'Measurement', values = ['Result', 'Type'])
df.loc[df['Type'] == 'C', ['Result']] = -1
print(df)

您可以先修改数据帧,然后再透视

df.loc[df['Type'] == 'C', 'Result'] = -1
df.loc[(df['Type'].isin(['A', 'B'])) & (df['Result'] < 0.5), 'Result'] = 0
df.loc[(df['Type'].isin(['A', 'B'])) & (df['Result'] >= 0.5), 'Result'] = 1

df.pivot(index = 'ID', columns = 'Measurement', values = ['Result', 'Type'])

            Result          Type
Measurement ScanA   ScanB   ScanA   ScanB
ID              
1           0       1       A       A
2           0       -1      B       C

编辑:使用np.选择正如@文本建议的那样

cond = [df['Type'] == 'C', (df['Type'].isin(['A', 'B'])) & (df['Result'] < 0.5), (df['Type'].isin(['A', 'B'])) & (df['Result'] >= 0.5)]
choice = [-1, 0, 1]
df['Result'] = np.select(cond, choice)

df.pivot(index = 'ID', columns = 'Measurement', values = ['Result', 'Type'])

作为Vaishali建议的替代方法,您可以使用numpy.where在生成piv之后修改它。你知道吗

t = piv['Type']  
r = piv['Result'].astype(float)

piv.loc[:, 'Result'] = np.where(
    t == 'A', np.where(r < 0.5, 0, 1), np.where(t == 'C', -1, r))
piv

            Result        Type      
Measurement  ScanA ScanB ScanA ScanB
ID                                  
1              0.0   1.0     A     A
2              0.2  -1.0     B     C

相关问题 更多 >