这里的目的是读入许多csv文件,每个文件都是一个单独的Pandas数据帧。在“=”之前,以下三行的第三行是错误的。我已经阅读了很多关于使用字典而不是动态变量的帖子,但是在这里看不到如何应用它。除了globals()之外还有其他方法吗?它似乎有很多反对它的论点?
//REDUX
import axios from 'axios';
var initialState = {
listingObj: null,
}
const GET_UPDATED_OBJ = 'GET_UPDATED_OBJ'
export function updateObj(obj, path, value) {
if (!path && !value) {
console.log('obj on mount', obj)
return {
type: UPDATE_LISTING_OBJ,
payload: obj
}
} else {
console.log('updated obj', obj)
path.split(",").slice(0, -1).reduce((obj, key) => obj[key] || (obj[key] = {}), obj)[path.split(",").pop()] = value;
return {
type: UPDATE_LISTING_OBJ,
payload: obj
}
}
}
export default function reducer(state = initialState, action) {
switch (action.type) {
case UPDATE_LISTING_OBJ:
return Object.assign({}, state, { listingObj: action.payload })
default: return state;
}
}
//IN REACT COMPONENT
import React from 'react';
import { connect } from 'react-redux';
import TextField from 'material-ui/TextField';
import axios from 'axios';
import { updateObj } from '../../../ducks/reducers/main_reducer'
class PropertyEdit extends React.Component {
constructor(props) {
super(props)
this.state = {
listing_id: ''
}
}
componentDidMount() {
let user_id = localStorage.getItem('user_id');
let listing_id = this.props.listingId
this.setState({
listing_id: listing_id
})
axios.get(`/api/listings/${listing_id}`).then((res) => {
this.props.updateObj(res.data)
})
}
handleChange = path => event => {
this.props.updateObj(this.props.listingObj, path, event.target.value)
};
render() {
return (
<div>
<CompanyNameAutofil />
<TextField
id="ownerStreetAddress"
label="Owner Street Address"
value={(this.props.listingObj.property.ownerCompany && this.props.listingObj.property.ownerCompany.streetAddress1) ? this.props.listingObj.property.ownerCompany.streetAddress1 : null}
onChange={this.handleChange('property,ownerCompany,streetAddress1')}
/>
</div>
)
}
}
function mapStateToProps(state) {
return state
}
export default connect(mapStateToProps, { updateObj })(PropertyEdit)
因此,例如,我正在寻找第一个迭代解释为:
testlist = ['A', 'B', 'C']
for dfsuffix in testlist:
'df' + dfsuffix = pandas.read_csv(dfsuffix + '.csv')
数据帧具有不同的行长度,因此我认为多维数组或多索引数据帧不是理想的。虽然它们具有相同的列,但我不想附加它们。
NB。我应该补充一点,我事先不知道测试列表的内容是什么,而不是它们将是用户输入填充的日期列表。
答案 0 :(得分:2)
字典是解决动态生成变量名称的首选解决方案。
考虑以下代码:
df = {}
testlist = ['A', 'B', 'C']
for dfsuffix in testlist:
df[dfsuffix] = pandas.read_csv(dfsuffix + '.csv')
与此代码没有什么不同:
df = {
'A': pandas.read_csv('A.csv'),
'B': pandas.read_csv('B.csv'),
'C': pandas.read_csv('C.csv')
}
以下两个陈述在功能上完全相同:
dfA = pandas.read_csv('A.csv')
df["A"] = pandas.read_csv('A.csv')
唯一的区别是字典在循环中更容易使用。存储的数据完全相同。