目前,我正在使用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但不能让它们同时工作。
答案 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