可从 pandas 数据框迭代
iterable from pandas dataframe
我需要创建一个形式为 (id, {feature name: features weight}) 的可迭代对象以使用 python 包。
我的数据存储在 pandas 数据框中,这里有一个例子:
data = pd.DataFrame({"id":[1,2,3],
"gender":[1,0,1],
"age":[25,23,40]})
对于 {feature name: features weight}) 部分,我知道我可以使用这个:
fe = data.to_dict(orient='records')
Out[28]:
[{'age': 25, 'gender': 1, 'id': 1},
{'age': 23, 'gender': 0, 'id': 2},
{'age': 40, 'gender': 1, 'id': 3}]
我知道我也可以遍历 datframe 来获取 id,像这样:
(row[1] for row in data.itertuples())
但是我可以把这两个放在一起得到一个可迭代的(生成器对象)
我试过了:
((row[1] for row in data.itertuples()),fe[i] for i in range(len(data)))
但语法错误。
你们知道怎么做吗?
我认为首先需要 set_index
by column id
and then to_dict
和 orient='index'
:
fe = data.set_index('id', drop=False).to_dict(orient='index')
print (fe)
{1: {'id': 1, 'gender': 1, 'age': 25},
2: {'id': 2, 'gender': 0, 'age': 23},
3: {'id': 3, 'gender': 1, 'age': 40}}
pd.DataFrame.itertuples
returns named tuples. You can iterate and convert each row to a dictionary via the purpose-built method _asdict
。您可以将其包装在生成器函数中以创建惰性 reader:
data = pd.DataFrame({"id":[1,2,3],
"gender":[1,0,1],
"age":[25,23,40]})
def gen_rows(df):
for row in df.itertuples(index=False):
yield row._asdict()
G = gen_rows(data)
print(next(G)) # OrderedDict([('age', 25), ('gender', 1), ('id', 1)])
print(next(G)) # OrderedDict([('age', 23), ('gender', 0), ('id', 2)])
print(next(G)) # OrderedDict([('age', 40), ('gender', 1), ('id', 3)])
请注意,结果将是 OrderedDict
个对象。作为 dict
的子类,对于大多数用途来说这应该足够了。
我需要创建一个形式为 (id, {feature name: features weight}) 的可迭代对象以使用 python 包。
我的数据存储在 pandas 数据框中,这里有一个例子:
data = pd.DataFrame({"id":[1,2,3],
"gender":[1,0,1],
"age":[25,23,40]})
对于 {feature name: features weight}) 部分,我知道我可以使用这个:
fe = data.to_dict(orient='records')
Out[28]:
[{'age': 25, 'gender': 1, 'id': 1},
{'age': 23, 'gender': 0, 'id': 2},
{'age': 40, 'gender': 1, 'id': 3}]
我知道我也可以遍历 datframe 来获取 id,像这样:
(row[1] for row in data.itertuples())
但是我可以把这两个放在一起得到一个可迭代的(生成器对象) 我试过了:
((row[1] for row in data.itertuples()),fe[i] for i in range(len(data)))
但语法错误。 你们知道怎么做吗?
我认为首先需要 set_index
by column id
and then to_dict
和 orient='index'
:
fe = data.set_index('id', drop=False).to_dict(orient='index')
print (fe)
{1: {'id': 1, 'gender': 1, 'age': 25},
2: {'id': 2, 'gender': 0, 'age': 23},
3: {'id': 3, 'gender': 1, 'age': 40}}
pd.DataFrame.itertuples
returns named tuples. You can iterate and convert each row to a dictionary via the purpose-built method _asdict
。您可以将其包装在生成器函数中以创建惰性 reader:
data = pd.DataFrame({"id":[1,2,3],
"gender":[1,0,1],
"age":[25,23,40]})
def gen_rows(df):
for row in df.itertuples(index=False):
yield row._asdict()
G = gen_rows(data)
print(next(G)) # OrderedDict([('age', 25), ('gender', 1), ('id', 1)])
print(next(G)) # OrderedDict([('age', 23), ('gender', 0), ('id', 2)])
print(next(G)) # OrderedDict([('age', 40), ('gender', 1), ('id', 3)])
请注意,结果将是 OrderedDict
个对象。作为 dict
的子类,对于大多数用途来说这应该足够了。