除了一个特定的行,如何划分熊猫Dataframe中的所有行?

时间:2018-02-06 03:45:34

标签: python pandas dataframe

目前,我正在使用pandas.DataFrame,我需要将整个数据帧除以一行以外的某个值。很容易将整个数据帧除以一个值,但我想保持其中一行完全相同。例如,如果我有一个如下所示的数据框:

  A      B      C      D
10000  10000  10000  10000 
10000  10000  10000  10000 
10000  10000  10000  10000 
10000  10000  10000  10000 
  1      1      1      1   
10000  10000  10000  10000 
10000  10000  10000  10000 

除了第5行,我想将所有行除以1000的值,我希望所有的值保持为1的相同。所以,新的数据帧看起来像这样:

 A   B   C   D
10  10  10  10
10  10  10  10
10  10  10  10
10  10  10  10
 1   1   1   1   
10  10  10  10 
10  10  10  10 

有一种简单的方法可以实现这一目标吗?我觉得我错过了一些非常基本的东西。我尝试过使用loc,iloc,mul,& div但不能让它们同时工作。

2 个答案:

答案 0 :(得分:3)

如果保存感兴趣的行,然后将整个数据帧除以所需的值。然后,您可以在之后恢复感兴趣的行。

代码:

<?php

$mo1 = "";

$sql = "SELECT c.Car, m.Model_id, m.Model FROM models m INNER JOIN car c ON c.Car_id = m.Car_id
WHERE m.Car_id = (SELECT Car_id FROM models WHERE Model = 'Escort')";

$result = mysqli_query($conn, $sql);
if (mysqli_num_rows($result) > 0) {
while($row = mysqli_fetch_assoc($result)) {
    $model = $row['Model'];
    $vehicle = $row['Car'];

 if($mo1 != $mo){$data.="<tr>
                            <td>$model</td>
                        </tr>";
                }

$data.="<tr>
            <td>$vehicle</td>
           </tr>";

$mo1=$mo;

}

?>

测试代码:

def df_divide_by_excect_row(in_df, divisor, row_to_ignore):
    row_to_save = in_df.iloc[row_to_ignore]
    new_df = in_df / divisor
    new_df.iloc[row_to_ignore] = row_to_save
    return new_df

结果:

import pandas as pd

df = pd.read_fwf(StringIO(u"""
      A      B      C      D
    10000  10000  10000  10000 
    10000  10000  10000  10000 
    10000  10000  10000  10000 
    10000  10000  10000  10000 
      1      1      1      1   
    10000  10000  10000  10000 
    10000  10000  10000  10000"""), header=1)

print(df)
print(df_divide_by_excect_row(df, 1000, 4))

答案 1 :(得分:3)

您可以使用条件列表推导来选择所有忽略的行。

n = 1000 
ignored_row = 4
df.iloc[[i for i in range(len(df)) if i != ignored_row], :] /= n
>>> df
    A   B   C   D
0  10  10  10  10
1  10  10  10  10
2  10  10  10  10
3  10  10  10  10
4   1   1   1   1
5  10  10  10  10
6  10  10  10  10

正如@DSM所指出的,您可以使用矢量化版本在具有多行的数据帧上获得更好的性能:

df.loc[np.arange(len(df)) != 4] /= n