如何通过混合iloc和loc在pandas DataFrame中设置值

时间:2015-08-27 20:27:07

标签: python pandas

假设我想要一个在DataFrame的给定行号中更改命名列值的函数 一种选择是找到列的位置并使用iloc,如下所示:

def ChangeValue(df, rowNumber, fieldName, newValue):
    columnNumber = df.columns.get_loc(fieldName)
    df.iloc[rowNumber, columnNumber] = newValue

但我想知道是否有办法一次性使用iloc和loc的魔力,并跳过手动转换。

有什么想法吗?

4 个答案:

答案 0 :(得分:2)

根据this answer

  

ix通常会尝试表现得像loc,但如果标签不在索引中,则会回归到iloc的行为。

因此,您应该特别能够df.ix[rowNumber, fieldname]使用type(df.index) != type(rowNumber)

答案 1 :(得分:0)

我建议仅将 [HttpGet] [Route("inventory/{ruta}")] public List<Inventory> GetInventory(String ruta) { List<Inventory> Ccclie = new List<Inventory>(); DateTime date = DateTime.Today; int day = (int)date.Day; int month = date.Month; int year = date.Year; try { using (OdbcConnection con = new OdbcConnection("Driver={Microsoft Visual FoxPro Driver};SourceType=DBF;Exclusive=No;Collate=Machine;" + @"NULL=NO;DELETED=YES;BACKGROUNDFETCH=NO;SourceDB=" + route)) { con.Open(); using (OdbcCommand cmd = new OdbcCommand("SELECT * FROM ccinven WHERE ruta = " + ruta+" and creacion = datetime("+year+", "+month+", "+day+")", con)) //20 { // OdbcDataReader reader = cmd.ExecuteReader(); OdbcDataReader DbReader = cmd.ExecuteReader(); while (DbReader.Read()) { Ccclie.Add(new Inventory { Cod1 = (DbReader["Cod1"].Equals(DBNull.Value)) ? "" : DbReader["Cod1"].ToString().Trim(), Codigo = (DbReader["Codigo"].Equals(DBNull.Value)) ? "" : DbReader["Codigo"].ToString().Trim(), Descrip = (DbReader["Descrip"].Equals(DBNull.Value)) ? "" : DbReader["Descrip"].ToString().Trim(), Precio = (DbReader["Precio"].Equals(DBNull.Value)) ? "" : DbReader["Precio"].ToString().Trim(), Num = (DbReader["Num"].Equals(DBNull.Value)) ? "" : DbReader["Num"].ToString().Trim(), Cantidad = (DbReader["Cantidad"].Equals(DBNull.Value)) ? "" : DbReader["Cantidad"].ToString().Trim(), Ruta = (DbReader["Ruta"].Equals(DBNull.Value)) ? "" : DbReader["Ruta"].ToString().Trim() }); } } } } catch (Exception ex) { Ccclie.Add(new Inventory { Cod1 = ex.ToString() }); } return Ccclie; } //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ iloc方法结合使用。例如:

Index.get_loc

有点笨拙,但足够简单。

df.iloc[0:10, df.columns.get_loc('column_name')] 的{​​{1}}和MultiIndex都带有一个序列;不幸的是,get_loc似乎只有前者。

答案 2 :(得分:0)

您可以这样做:

df.iloc[rowNumber].loc[fieldName] = newValue

示例

import pandas as pd

def ChangeValue(df, rowNumber, fieldName, newValue):
    df.iloc[rowNumber].loc[fieldName] = newValue

df = pd.DataFrame([[0, 2, 3], [0, 4, 1], [10, 20, 30]],
                  index=[4, 5, 6], columns=['A', 'B', 'C'])
print(df)
    A   B   C
4   0   2   3
5   0   4   1
6  10  20  30

ChangeValue(df, 1, "B", 999)
print(df)
    A    B   C
4   0    2   3
5   0  999   1
6  10   20  30

但是要小心,如果newValue不是同一类型,则它将无法正常工作,并且将以静默方式失败

ChangeValue(df, 1, "B", "Oops")
print(df)
    A    B   C
4   0    2   3
5   0  999   1
6  10   20  30

这里有一些有关使用列数据类型的好信息:Change column type in pandas

答案 3 :(得分:-1)

即使不是每种情况都适用,如果您要查找顶部或底部条目,我想添加一个简单的示例:

    df.head(1)['column_name']  # first entry in 'column_name'
    df.tail(5)['column_name']  # last 5 entries in 'column_name'