假设我想要一个在DataFrame的给定行号中更改命名列值的函数 一种选择是找到列的位置并使用iloc,如下所示:
def ChangeValue(df, rowNumber, fieldName, newValue):
columnNumber = df.columns.get_loc(fieldName)
df.iloc[rowNumber, columnNumber] = newValue
但我想知道是否有办法一次性使用iloc和loc的魔力,并跳过手动转换。
有什么想法吗?
答案 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'