这是MRE:
public class LoginActivity extends AppCompatActivity {
private EditText mPhoneNumber, mCode;
private Button mSend;
private PhoneAuthProvider.OnVerificationStateChangedCallbacks mCallbacks;
String mVerificationId;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
FirebaseApp.initializeApp(this);
userIsLoggedIn();
mPhoneNumber = findViewById(R.id. phoneNumber);
mCode = findViewById(R.id.code);
mSend = findViewById(R.id.send);
mSend.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (mVerificationId != null)
verifyPhoneNumberWithCode();
else
startPhoneNumberVerification();
}
});
mCallbacks = new PhoneAuthProvider.OnVerificationStateChangedCallbacks() {
@Override
public void onVerificationCompleted(PhoneAuthCredential phoneAuthCredential) {
signInWithPhoneAuthCredential(phoneAuthCredential);
}
@Override
public void onVerificationFailed(FirebaseException e) {}
@Override
public void onCodeSent(String verificationId, PhoneAuthProvider.ForceResendingToken forceResendingToken) {
super.onCodeSent(verificationId, forceResendingToken);
mVerificationId = verificationId;
mSend.setText("Verify Code");
}
};
}
private void verifyPhoneNumberWithCode(){
PhoneAuthCredential credential = PhoneAuthProvider.getCredential(mVerificationId, mCode.getText().toString());
signInWithPhoneAuthCredential(credential);
}
private void signInWithPhoneAuthCredential(PhoneAuthCredential phoneAuthCredential) {
FirebaseAuth.getInstance().signInWithCredential(phoneAuthCredential).addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
}if(task.isSuccesful()){ // **here is the PROBLEM**
final FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
if (user != null){
final DatabaseReference mUserDB = FirebaseDatabase.getInstance().getReference().child("user").child(user.getUid());
mUserDB.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
if (!dataSnapshot.exists()){
Map<String, Object> userMap = new HashMap<>();
userMap.put("phone", user.getPhoneNumber());
userMap.put("name", user.getPhoneNumber());
mUserDB.updateChildren(userMap);
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {}
});
}
}
//userIsLoggedIn();
});
}
private void userIsLoggedIn() {
FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
if (user != null){
startActivity(new Intent(getApplicationContext(), MainPageActivity.class));
finish();
return;
}
}
private void startPhoneNumberVerification() {
PhoneAuthProvider.getInstance().verifyPhoneNumber(
mPhoneNumber.getText().toString(),
60,
TimeUnit.SECONDS,
this,
mCallbacks);
}
}
我想做的是遍历每个字典,并将每个值附加到数据框中的一列。
我现在正在做
data = [
{'1':20},
{'1':10},
{'1':40},
{'1':14},
{'1':33}
]
输出:
import pandas as pd
lst = []
for item in data:
lst.append(item['1'])
df = pd.DataFrame({"col1":lst})
是的,这是我想要的,但是列表中有超过100万个字典。这是最有效的方法吗?
编辑:
col1
0 20
1 10
2 40
3 14
4 33
完全适用于上述情况,但是如果数据看起来像这样呢?
pd.DataFrame(data).rename(columns={'1':'col1'})
所以我会用:
data = [
{'1':
{'value':20}},
{'1':
{'value':10}},
{'1':
{'value':40}},
{'1':
{'value':14}},
{'1':
{'value':33}}]
有没有更有效的方法来查找包含字典的字典列表?
答案 0 :(得分:2)
一个想法是将data
传递给DataFrame
辅助控制器,然后使用rename
:
df = pd.DataFrame(data).rename(columns={'1':'col1'})
print (df)
col1
0 20
1 10
2 40
3 14
4 33
如果有必要进行过滤,请使用列表理解并添加参数columns
:
df = pd.DataFrame([x['1'] for x in data], columns=['col1'])
print (df)
col1
0 20
1 10
2 40
3 14
4 33
编辑:对于新数据,请使用:
data = [
{'1':
{'value':20}},
{'1':
{'value':10}},
{'1':
{'value':40}},
{'1':
{'value':14}},
{'1':
{'value':33}}]
df = pd.DataFrame([x['1']['value'] for x in data], columns=['col1'])
print (df)
col1
0 20
1 10
2 40
3 14
4 33
或者:
df = pd.DataFrame([x['1'] for x in data]).rename(columns={'value':'col1'})
print (df)
col1
0 20
1 10
2 40
3 14
4 33
答案 1 :(得分:2)
@jezrael的回答是正确的,但更具体地讲col
:
df = pd.DataFrame(data)
print(df.add_prefix('col'))
输出:
col1
0 20
1 10
2 40
3 14
4 33